JPA 注解(一)
1、@Entity(name="EntityName")
????? 表示该类是一个可持化的实体。当在容器中时,服务器将会首先加载所有标注了@Entity注释的实体类,其中@Entity中的“name”属性表示实体名称,若不作设置,默认为标注实体类的名称(注意大小写与系统的关系。)。 @Entity标注是必需的 ,name属性为可选。?
?以上的@Table注释表示指定数据库名“test”,表名为“tb_contact”,并创建了两组唯一索引。
3、@Column
??????? @Column标记表示持久化属性映射表中的字段。此标记可以标注在Getter方法或属性前。
如标注在属性前
? 生成的SQL脚本为
分类类型Java的基本数据类型byte、int、short、long、boolean、char、float、doubleJava的基本数据类型对应的封装类Byte、Int、Short、Long、Boolean、Character、Float、Double字节和字符型数组byte[]、Byte[]、char[]、Character[]大数值类型java.math.BigInteger
java.math.BigDecimal字符串类型java.lang.String日期时间类型java.util.Date
java.util.Calendar
java.sql.Date
java.sql.Time
java.sql.Timestamp枚举型用户自定义的枚举型Entity类型标注为@Entity的类包含Entity类型的集合Collection类java.util.Collection
java.util.Set
java.util.List
java.util.Map嵌入式(embeddable)类?Java数据类型与数据库中的类型转换是由JPA实现框架自动转换的,所以不同的JPA实现框架转换的规则也不太一样。
???? 例如MySQL中,varchar和char类型都转化为String类型。Blob和Clob类型可以转化成Byte[]型。由于类型转化是JPA底层来实现的,这就遇到一个问题,很有可能在将表中的数据转换成Java的数据类型时出现异常。
?????? 我们知道对于可以持久化的Java类型中,即可以映射基本的数据类型,如byte、int、short、long、boolean、char、float、double等,也可以映射成Byte、Int、Short、Long、Boolean、Character、Float、Double类型。那么选择哪种类型比较合适呢?
举下面的例子进行说明。
?
5、@Id
?????? 主键是实体的唯一标识,调用EntityManager的find方法,可以获得相应的实体对象。每一个实体类至少要有一个主键(Primary key)。
?????? 一旦使用@Id标记属性为主键,该实体属性的值可以指定,也可以根据一些特定的规则自动生成。这就涉及另一个标记@GeneratedValue的使用。
?????? @GeneratedValue标注有以两个属性:
?????? (1)strategy属性表示生成主键的策略,有4种类型,分别定义在枚举型GenerationType中,其中有GenerationType.TABLE、GenerationType.SEQUENCE、GenerationType.IDENTITY、GenerationType.AUTO,其中,默认为AUTO,表示自动生成。
?????? (2)generator为不同策略类型所对应的生成规则名,它的值根据不同的策略有不同的设置。
?????? (3)能够标识为主键的属性类型,有如表5-2所列举的几种。
分类类型Java的基本数据类型byte、int、short、long、charJava的基本数据类型对应的封装类Byte、Integer、Short、Long、Character大数值类型 java.math.BigInteger字符串类型java.lang.String时间日期型java.util.Date
java.sql.Date?
?
?
?
?
?
?
?
?
?
?
?
?
?????? double和float浮点类型和它们对应的封装类不能作为主键,这是因为判断是否唯一是通过equals方法来判断的,浮点型的精度太大,不能够准确地匹配。
?????? 例一,自增主键。在不同的数据库,自增主键的生成策略可能有所不同。例如MySQL的自增主键可以通过IDENTITY来实现,而Oracle可能需要创建Sequence来实现自增。JPA的实现将会根据不同的数据库类型来实现自增的策略。
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface SequenceGenerator { String name(); String sequenceName() default ""; int initialValue() default 0; int allocationSize() default 50; }?name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
sequenceName属性表示生成策略用到的数据库序列名称。
initialValue表示主键初识值,默认为0。
allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。?
?
?
?
?
?
?
?
?
?