大漠駝鈴

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

          JPA annotation 筆記

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

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

          這里我重點來說下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中設置的"generator"值中
          table:表示表生成策略所持久化的表名,說簡單點就是一個管理其它表主鍵的表,本例中,這個表名為ID_GEN
          pkColumnName:表生成器中的列名,用來存放其它表的主鍵鍵名,一般來說一個主鍵鍵名對應一張其他表要獲取主鍵值對應的key。這個值要與數據庫的列對應,比如GEN_NAME對應id_gen中的主鍵名稱
          pkColumnValue:該實體所要訪問對應主鍵生成表的主鍵的key值
          valueColumnName:表生成器所要對應pkColumnName主鍵的下一個值,這個值也要和表生成器中的列名對應
          allocationSize:表示每次主鍵值增加的大小,例如設置成1,則表示每次創建新記錄后自動加1,默認為50

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



          表id_gen內的數據為

          GEN_NAME GEN_VALUE
          Card_Gen  2

          表t_creditcard內的數據為

          ID CARDNAME
          1   測試卡

          再執行一次程序
          表id_gen內的數據為

          GEN_NAME GEN_VALUE
          Card_Gen  3

          表t_creditcard內的數據為

          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已經被改為Card_Gen2。

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

          表id_gen內的數據為

          GEN_NAME GEN_VALUE
          Card_Gen  3
          Card_Gen2  2

          表t_creditcard內的數據還是為

          ID CARDNAME
          1   測試卡
          2   測試卡

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

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

          1.使用系統毫秒數作為主鍵
          @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);



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

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

          主站蜘蛛池模板: 奈曼旗| 化州市| 京山县| 镇沅| 昌宁县| 右玉县| 高台县| 仁怀市| 沙雅县| 根河市| 绥芬河市| 辽源市| 德安县| 浮山县| 北辰区| 永昌县| 甘洛县| 荔浦县| 响水县| 黄浦区| 东兰县| 枣庄市| 苗栗县| 中宁县| 衡东县| 渭南市| 克什克腾旗| 峡江县| 武威市| 股票| 永定县| 开平市| 博客| 法库县| 濉溪县| 贵港市| 太康县| 黄梅县| 古田县| 海安县| 娄烦县|