MyEclipse6Java开发中文教程 主要的用途是为了进行查询时(通过 JPA QL)区分不同的实体,例如下面的查询代码: select mode/ from User model和 select model from Myuser model,将会最终去寻找不同 的实体定义。而例子中的实体名则是User。实际使用中可以不用写name属性,只写一个 @ Entity的标注,这时候实体名等于类名(不含包路径,例如 entity. MyUser最后对应的实 体名是 MyUser)。和 Hibernate中一样,这个实体名必须是唯一的!而此标注也是必须的! @ Table:顾名思义,定义当前 Entity对应数据库中的表,需要注意的是主表( pnmary tabe),因为其它的表还可以通过@ Secondary Table或者@ Secondary Tables来进行标注 在例子中它对应的数据库中的表是 myuser(用name属性定义),所在的数据库名为test (用 catalog属性定义)。实践中此标记及其附属的属性都可以省略不写,这时候对应的数 据库表就是对应着实体的名字。这个标注可以不用定义,不是必须的 @d:定义了实体的主键信息。在一个实体类中只有一个主键标注,而此标注也是必须 的!它本身没有任何额外的属性可以设置。默认情况下它对应数据库中的类型和名字和当前 属性或者实体的变量相同的列(这是因为属性可以标注在属性和变量上,后文会有进一步的 介绍)。如果下面有@ Column标记,那么对应的数据库列信息以此标记中的内容为准。 @ Generatedvalue:一般它和ID的标注配合使用,用来制定主键的生产策略。通过 strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如 Sq| Server对应 identity,MySq对应 auto increment e在 javax. persistence. GenerationType 这个枚举类中定义了以下几种可供选择的策略: 1)∥ DENT/TY:表自增键字段, Oracle不支持这种方式; 2)AUTO:JPA自动选择合适的策略,是默认选项(不幸的是大部分时候都会选择成 Sequence); 3) SEQUENCE:通过序列产生主键,还可以进一步通过@ Sequence Generator标注来指定 更详细的生产方式,MySq不支持这种方式(注:@ Sequence Generator用法示例: @Generatedvaluestrategy=Generation Type SEQUENCE) @ Sequence Generator(name="sEQ_TEST,∥此生成器的别名 sequence Name=" ser SEQ"∥对应的 Oracle sequence的名字 allocation Size=25) ) 4) TABLE:通过表彥生主键,框架借由表模拟序列( sequence)产生主键,使用该策略可 以使应用更易于数据库移植。不同的JPA厂商所默认生成的表名是不同的,如 OpenJPA 生成 openjpa sequence table表, Hibernate生成一个 hibernate sequences表,而 TopLink则生成 sequence表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME 和SEQ_ COUNT 另外还有一个重要的属性就是 generator,它可以更进一步制定主键生成器所采用的参 数,例如 sequence表的表名可以这样定义:@ Generated Value( strategy= SEQUENCE, generator="CUST_SEQ")。同样的也可以用于 TABLE方式的生成器上 @Generated Value(strategy= TABLE, generator="CUST GEN) @ Column:属性或者变量对应的表字段。一般来说我们并不需要指定表字段的类型, 因为JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度, 以便可以自动生成DDL语句:还可以指定一些其它的属性例如是否唯一( unique),是否可 以为空( nullable),是否可以插入和更新等等( insertable和 updatable);name属性指定 了它对应于数据库中的列名。如果是时间类型,一般还需要指定精度,用@7 emporal来进 行标注。同样的这个标注也不是必须的,如果没有写任何参数的话,它的名字和类型都和当 前标注的属性或者变量的名字和类型相同 刘长炯著MyEclipse 6 Java 开发中文教程 10 刘长炯著 主要的用途是为了进行查询时(通过 JPA QL)区分不同的实体,例如下面的查询代码: select model from User model 和 select model from Myuser model,将会最终去寻找不同 的实体定义。而例子中的实体名则是 User。实际使用中可以不用写 name 属性,只写一个 @Entity 的标注,这时候实体名等于类名(不含包路径,例如 entity.MyUser 最后对应的实 体名是 MyUser)。和 Hibernate 中一样,这个实体名必须是唯一的!而此标注也是必须的! @Table:顾名思义,定义当前 Entity 对应数据库中的表,需要注意的是主表(primary table),因为其它的表还可以通过@SecondaryTable 或者@SecondaryTables 来进行标注。 在例子中它对应的数据库中的表是 myuser(用 name 属性定义),所在的数据库名为 test (用 catalog 属性定义)。实践中此标记及其附属的属性都可以省略不写,这时候对应的数 据库表就是对应着实体的名字。这个标注可以不用定义,不是必须的。 @Id:定义了实体的主键信息。在一个实体类中只有一个主键标注,而此标注也是必须 的!它本身没有任何额外的属性可以设置。默认情况下它对应数据库中的类型和名字和当前 属性或者实体的变量相同的列(这是因为属性可以标注在属性和变量上,后文会有进一步的 介绍)。如果下面有@Column 标记,那么对应的数据库列信息以此标记中的内容为准。 @GeneratedValue:一般它和 ID 的标注配合使用,用来制定主键的生产策略。通过 strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略,如 SqlServer 对应 identity,MySql 对应 auto increment。在 javax.persistence.GenerationType 这个枚举类中定义了以下几种可供选择的策略: 1) IDENTITY:表自增键字段,Oracle 不支持这种方式; 2) AUTO: JPA 自动选择合适的策略,是默认选项(不幸的是大部分时候都会选择成 Sequence); 3) SEQUENCE:通过序列产生主键,还可以进一步通过@SequenceGenerator 标注来指定 更详细的生产方式,MySql 不支持这种方式(注:@SequenceGenerator 用法示例: @GeneratedValue(strategy=GenerationType.SEQUENCE) @SequenceGenerator(name="SEQ_TEST", // 此生成器的别名 sequenceName="User_SEQ",// 对应的 Oracle sequence 的名字 allocationSize=25) ); 4) TABLE:通过表产生主键,框架借由表模拟序列(sequence)产生主键,使用该策略可 以使应用更易于数据库移植。不同的 JPA 厂商所默认生成的表名是不同的,如 OpenJPA 生成 openjpa_sequence_table 表,Hibernate 生成一个 hibernate_sequences 表,而 TopLink 则生成 sequence 表。这些表都具有一个序列名和对应值两个字段,如 SEQ_NAME 和 SEQ_COUNT。 另外还有一个重要的属性就是 generator,它可以更进一步制定主键生成器所采用的参 数,例如 sequence 表的表名可以这样定义:@GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ") 。同样的也可以用于 TABLE 方式的生成器上: @GeneratedValue(strategy=TABLE, generator="CUST_GEN")。 @Column:属性或者变量对应的表字段。一般来说我们并不需要指定表字段的类型, 因为 JPA 会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度, 以便可以自动生成 DDL 语句;还可以指定一些其它的属性例如是否唯一(unique),是否可 以为空(nullable),是否可以插入和更新等等(insertable 和 updatable);name 属性指定 了它对应于数据库中的列名。如果是时间类型,一般还需要指定精度,用@Temporal 来进 行标注。同样的这个标注也不是必须的,如果没有写任何参数的话,它的名字和类型都和当 前标注的属性或者变量的名字和类型相同