<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大漠駝鈴

    置身浩瀚的沙漠,方向最為重要,希望此blog能向大漠駝鈴一樣,給我方向和指引。
    Java,Php,Shell,Python,服務(wù)器運維,大數(shù)據(jù),SEO, 網(wǎng)站開發(fā)、運維,云服務(wù)技術(shù)支持,IM服務(wù)供應(yīng)商, FreeSwitch搭建,技術(shù)支持等. 技術(shù)討論QQ群:428622099
    隨筆 - 238, 文章 - 3, 評論 - 117, 引用 - 0
    數(shù)據(jù)加載中……

    JPA annotation 筆記

    @Id 顧名思義,就不多說了。

    @GeneratedValue:主鍵的產(chǎn)生策略,通過strategy屬性指定。
    默認情況下,JPA自動選擇一個最適合底層數(shù)據(jù)庫的主鍵生成策略,如SqlServer對應(yīng)identity,MySql對應(yīng)auto increment。
    在javax.persistence.GenerationType中定義了以下幾種可供選擇的策略:
    1) IDENTITY:表自增鍵字段,Oracle不支持這種方式;
    2) AUTO: JPA自動選擇合適的策略,是默認選項;
    3) SEQUENCE:通過序列產(chǎn)生主鍵,通過@SequenceGenerator注解指定序列名,MySql不支持這種方式;
    4) TABLE:通過表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫移植。

    這里我重點來說下GenerationType.TABLE的情況。
    把庫表的主鍵auto_increment去掉
    CREATE TABLE `t_creditcard` (   
      `id` int(11) NOT NULL,   
      `cardName` varchar(20) NOT NULL,   
      PRIMARY KEY  (`id`)   
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    CREATE TABLE `id_gen` (
      `gen_name` varchar(80) NOT NULL default '',
      `gen_val` int(11) default NULL,
      PRIMARY KEY  (`gen_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

    @Entity
    @Table(name="t_creditcard")
    public class CreditCard{
        @TableGenerator(name = "CardPkGen",
                  table = "ID_GEN",
                  pkColumnName = "GEN_NAME",
                  pkColumnValue = "Card_Gen",
                  valueColumnName = "GEN_VAL",
                  allocationSize = 1
        )
        @Id
        @GeneratedValue(strategy=GenerationType.TABLE,generator="CardPkGen")
        private Long id;


    @GeneratedValue:定義主鍵生成策略,這里因為使用的是TableGenerator,所以,主鍵的生成策略為GenerationType.TABLE,生成主鍵策略的名稱則為前面定義的"CardPkGen”。
    @TableGenerator各屬性含義如下:
    name:表示該表主鍵生成策略的名稱,這個名字可以自定義,它被引用在@GeneratedValue中設(shè)置的"generator"值中
    table:表示表生成策略所持久化的表名,說簡單點就是一個管理其它表主鍵的表,本例中,這個表名為ID_GEN
    pkColumnName:表生成器中的列名,用來存放其它表的主鍵鍵名,一般來說一個主鍵鍵名對應(yīng)一張其他表要獲取主鍵值對應(yīng)的key。這個值要與數(shù)據(jù)庫的列對應(yīng),比如GEN_NAME對應(yīng)id_gen中的主鍵名稱
    pkColumnValue:該實體所要訪問對應(yīng)主鍵生成表的主鍵的key值
    valueColumnName:表生成器所要對應(yīng)pkColumnName主鍵的下一個值,這個值也要和表生成器中的列名對應(yīng)
    allocationSize:表示每次主鍵值增加的大小,例如設(shè)置成1,則表示每次創(chuàng)建新記錄后自動加1,默認為50

    按照以上結(jié)構(gòu),如果我們執(zhí)行:
    CreditCard cc = new CreditCard();
    cc.setCardName("測試卡");
    cc = ccDao.persist(cc);



    表id_gen內(nèi)的數(shù)據(jù)為

    GEN_NAME GEN_VALUE
    Card_Gen  2

    表t_creditcard內(nèi)的數(shù)據(jù)為

    ID CARDNAME
    1   測試卡

    再執(zhí)行一次程序
    表id_gen內(nèi)的數(shù)據(jù)為

    GEN_NAME GEN_VALUE
    Card_Gen  3

    表t_creditcard內(nèi)的數(shù)據(jù)為

    ID CARDNAME
    1   測試卡
    2   測試卡

    把實體類的annation改寫為:
    @Entity
    @Table(name="t_creditcard")
    public class CreditCard{
        @TableGenerator(name = "CardPkGen",
                  table = "ID_GEN",
                  pkColumnName = "GEN_NAME",
                  pkColumnValue = "Card_Gen2",
                  valueColumnName = "GEN_VAL",
                  allocationSize = 1
        )
        @Id
        @GeneratedValue(strategy=GenerationType.TABLE,generator="CardPkGen")
        private Long id;


    注意看,pkColumnValue已經(jīng)被改為Card_Gen2。

    執(zhí)行程序,插入數(shù)據(jù)失敗,拋出t_creditcard表主鍵重復(fù)的異常,因為這次去名為Card_Gen2的這個主鍵生成器去拿來的id為1,t_creditcard表之前已經(jīng)插入過一條主鍵為1的數(shù)據(jù)了。

    表id_gen內(nèi)的數(shù)據(jù)為

    GEN_NAME GEN_VALUE
    Card_Gen  3
    Card_Gen2  2

    表t_creditcard內(nèi)的數(shù)據(jù)還是為

    ID CARDNAME
    1   測試卡
    2   測試卡

    結(jié)論:在有些應(yīng)用中,我們可以適用@TableGenerator來統(tǒng)一管理我們數(shù)據(jù)庫中的各個表的主鍵生成,如果我們的應(yīng)用中有10個實體需要使用自動生成的主鍵,只需在每個實體中使用@TableGenerator并給出不同的pkColumnValue值就可以了。

    @Id還有一些另類的用法:

    1.使用系統(tǒng)毫秒數(shù)作為主鍵
    @Id
    private Long id = System.currentTimeMillis();
    CreditCard cc = new CreditCard();
    cc.setCardName("測試卡");
    cc = ccDao.persist(cc);


    2.使用UUID作為主鍵
    @Id
    private String id;;

    CreditCard cc = new CreditCard();
    cc.setId(UUID.randomUUID().toString());
    cc.setCardName("測試卡");
    cc = ccDao.persist(cc);



    別忘了修改庫表中主鍵字段的大小和對應(yīng)的類型.

    posted on 2009-02-22 22:08 草原上的駱駝 閱讀(1664) 評論(0)  編輯  收藏 所屬分類: JAVA框架

    主站蜘蛛池模板: 337p日本欧洲亚洲大胆色噜噜| 久久综合亚洲色一区二区三区| 91亚洲国产成人久久精品 | 免费一区二区无码东京热| 4虎1515hh永久免费| 亚洲av成人一区二区三区在线观看 | 亚洲成av人片在线天堂无| 大地资源网高清在线观看免费| 亚洲伊人成无码综合网 | 成人午夜免费福利| 亚洲av色影在线| 成人a毛片免费视频观看| 无码人妻久久一区二区三区免费丨| 中文字幕亚洲电影| 337p日本欧洲亚洲大胆人人| 最刺激黄a大片免费网站| 亚洲线精品一区二区三区影音先锋 | 在线成人爽a毛片免费软件| 亚洲黄色网址大全| 在线看片免费不卡人成视频| 亚洲字幕AV一区二区三区四区| 久99久精品免费视频热77| 亚洲国产高清在线一区二区三区| 亚洲av永久无码精品天堂久久 | 成年在线观看免费人视频草莓| 亚洲中文字幕无码久久| 国产精品色午夜视频免费看| 亚洲成年人电影在线观看| a级毛片100部免费观看| MM131亚洲国产美女久久| 亚洲免费人成在线视频观看| 亚洲国产中文字幕在线观看| 欧美激情综合亚洲一二区| 最近最新中文字幕完整版免费高清| 亚洲日韩乱码中文字幕| 最近中文字幕免费mv视频7| 无码免费又爽又高潮喷水的视频| 亚洲AV无码乱码国产麻豆| 国产亚洲精品免费视频播放| 亚洲综合色在线观看亚洲| 99视频精品全部免费观看|