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;CreditCard cc = new CreditCard();cc.setCardName("测试卡");cc = ccDao.persist(cc);@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;@Idprivate Long id = System.currentTimeMillis();CreditCard cc = new CreditCard();cc.setCardName("测试卡");cc = ccDao.persist(cc);@Idprivate String id;;CreditCard cc = new CreditCard();cc.setId(UUID.randomUUID().toString());cc.setCardName("测试卡");cc = ccDao.persist(cc);