hibernateJTA标记.docx_第1页
hibernateJTA标记.docx_第2页
hibernateJTA标记.docx_第3页
hibernateJTA标记.docx_第4页
hibernateJTA标记.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/cnbxj/blog/item/810acd01ca716b0d1c95837c.htmlHibernate JPA标记学习1.Entity 通过注释Entity或者(Entity())表示被标示的类对应数据库中的一张表。 Entity public class TravelProfile . 上面的例子告诉O/R映射引擎,类TravelProfile是可以持久化的,同时它对应数据库中的一张表。但是它没有指明对应哪个数据库中的哪张表。 2.元数据映射标记 2.1 Table Table()标记为实体初始化一张表,定义如下: Target(TYPE) Retention(RUNTIME) public interface Table String name() default ; String catalog() default ; String schema() default ; UniqueConstraint uniqueConstraints() default ; Name:指明表的名字。(可选) Catalog:表示表的catalog.(可选) Schema:表示表的schema.(可选) uniqueConstraints:制定表的唯一约束。(可选) 因为所有的属性都是可选的,也就是说Table可以在进行映射的时候可以不标明。当不标明的情况下表的名字就是实体的类名。表属于的schema就是所 属实体单元集的schema(就是当前连接数据库的用户)。 下面给出的例子中,指明表为CUST,所属的schema为RECORDS: Entity Table(name=CUST, schema=RECORDS) public class Customer . 2.2 UniqueConstraint标记 UniqueConstraint用来指定表字段的唯一约束,定义如下: Target() Retention(RUNTIME) public interface UniqueConstraint String columnNames(); columnNames:制定唯一约束的字段。 Entity Table( name=EMPLOYEE, uniqueConstraints= UniqueConstraint(columnNames=EMP_ID, EMP_NAME) ) public class Employee . 上面的例子,唯一约束标记指定字段EMP_ID和字段EMP_NAME在表中EMPLOYEE中是唯一的。 2.3Column标记 Column标记把实体的属性或域映射到表的字段,当没有在实体的属性或域中使用该标记那数据库的对应表的字段名就是实体的属性名或域名。其定义为: Target(METHOD, FIELD) Retention(RUNTIME) public interface Column String name() default ; boolean unique() default false; boolean nullable() default true; boolean insertable() default true; boolean updatable() default true; String columnDefinition() default ; String table() default ; int length() default 255; int precision() default 0; / decimal precision int scale() default 0; / decimal scale Name:指定字段名。 Unique:指明该字段是否唯一,默认为false。 Nullable:指明是否可以为空,默认是true。 Insertable:指明该字段在产生SQL INSERT语句中是否产生该字段。 Updatable:指明该字段在产生SQL INSERT语句中是否产生该字段。 columnDefinition:指定产生表的时候,使用它指定该字段一些属性。 Table:当一个实体对应多个表的时候,指定该字段属于哪个表。 Length:制定该字段的长度(只有在字段为字符类型的才有用),默认是255。 Precision: 指明字段的精度(在字段为decimal类型的时候使用),默认是0 Scale:为字段为number型指定标量,默认为0。 下面给出例子: Column(name=DESC, nullable=false, length=512) public String getDescription() return description; Column(name=DESC, columnDefinition=CLOB NOT NULL, table=EMP_DETAIL) Lob public String getDescription() return description; Column(name=ORDER_COST, updatable=false, precision=12, scale=2) public BigDecimal getCost() return cost; 2.4JoinColumn标记 JoinColumn标记用来映射实体之间的关联关系,定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface JoinColumn String name() default ; String referencedColumnName() default ; boolean unique() default false; boolean nullable() default true; boolean insertable() default true; boolean updatable() default true; String columnDefinition() default ; String table() default ; Name:指定外键字段名,缺省的名字是被引用实体在引用实体内部的属性标量名或域名加上下划线”_”,再加上被引用实体的主键字段名构成。 ReferencedColumnName:被引用表的字段,如果没有那缺省的就是该表的主键。 Unique:指明该字段是否唯一,默认为false。 Nullable:外键是否可以为空,默认是true。 Insertable:指明该字段在产生SQL INSERT语句中是否产生该字段。 Updatable:指明该字段在产生SQL INSERT语句中是否产生该字段。 columnDefinition:指定产生表的时候,使用它指定该字段一些属性。 Table:当一个实体对应多个表的时候,指定该字段属于哪个表。 下面例子的多对一关系中,指明了被引用实体在本实体的外键为ADDR_ID。 ManyToOne JoinColumn(name=ADDR_ID) public Address getAddress() return address; 2.5JoinColumns标记 JoinColumns标记用在符合外键的时候,这个时候属性name和referencedColumnName必须在JoinColumn中进行 初始化。例如: ManyToOne JoinColumns( JoinColumn(name=ADDR_ID, referencedColumnName=ID), JoinColumn(name=ADDR_ZIP, referencedColumnName=ZIP) ) public Address getAddress() return address; 2.6Id标记 Id标记把实体属性或域映射到表的主键。其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface Id 下面例子通过标记Id初始化实体的主键为id,也可以通过加上标记Column(name=”PrimaryKey”)自定义表的主键。 Id public Long getId() return id; 2.7GeneratedValue标记 提供产生主键的策略,这就意味着它只能在出现标记Id的情况下使用。其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface GeneratedValue GenerationType strategy() default AUTO; String generator() default ; public enum GenerationType TABLE, SEQUENCE, IDENTITY, AUTO ; 策略类型为枚举类型,共有四种类型分别为:TABLE, SEQUENCE, IDENTITY, AUTO。 TABLE:提示持久化引擎实现者,使用数据库的表来产生和维护主键。 SEQUENCE和IDENTITY:分别指定使用当前数据库的序列号和标识字段来产生唯一表识。 AUTO:制定持久化引擎实现者,为不同的数据库选择合适的策略产生唯一标识。 Generator:制定主键产生器,默认有持久化实现者提供。例如: Id GeneratedValue(strategy=SEQUENCE, generator=CUST_SEQ) Column(name=CUST_ID) public Long getId() return id; Id GeneratedValue(strategy=TABLE, generator=CUST_GEN) Column(name=CUST_ID) Long id; 2.8IdClass标记 这个标记用来指定一个实体类作为一个另外一个实体的主键。这个时候要求实体的复合主键的每个属性或域必须和复合主键类对应的属性或域是一样的。其定义如 下: Target(TYPE) Retention(RUNTIME) public interface IdClass Class value(); 下面例子中,复合主键类为EmployeePK,包含域empName和birthday类型分别为String,Date。 IdClass(com.jl.hr.EmployeePK.class) Entity public class Employee Id String empName; Id Date birthDay; 2.9Transient标记 标记指示实体的属性或域是非持久化的。其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface Transient 下面的例子说明实体 Employee的域currentUser是非持久化的。 Entity public class Employee Id int id; Transient User currentUser; . 2.10Version标记 初始化实体的乐观锁的值,这个标记在大量并发访问的实体中非常有用。如果要对实体使用这个标记那最好的策略是一个实体使用一个Version标记,同时 这个标记对应字段的类型一般为:int,Integer,short,Short,long,Long,Timestamp中的一种。其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface Version 给出相关的例子如下: Version Column(name=OPTLOCK) protected int getVersionNum() return versionNum; 2.11Lob标记 此标记初始化实体的属性或域映射成数据库支持的大对象类型。大对象可以是字符也可以是二进制类型。除了字符串和字符类型的默认映射成Blob类型,其它的 类型根据实体属性或域的类型来决定数据库大对象的类型。例如: Lob Column(name=REPORT) protected String report; Lob Basic(fetch=LAZY) Column(name=EMP_PIC, columnDefinition=BLOB NOT NULL) protected byte pic; 2.12Enumerated标记 用来指定实体持久化属性的为枚举类型,其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface Enumerated EnumType value() default ORDINAL; public enum EnumType ORDINAL, STRING 如果标记没有显性给出或者EnumType没有指定,那枚举类型默认为ORDINAL数字标识。例如: public enum EmployeeStatus FULL_TIME, PART_TIME, CONTRACT public enum SalaryRate JUNIOR, SENIOR, MANAGER, EXECUTIVE Entity public class Employee . public EmployeeStatus getStatus() . Enumerated(STRING) public SalaryRate getPayScale() . . 上面例子中,定义了两个枚举类型EmployeeStatus和SalaryRate。在实体两个属性status类型为EmployeeStatus, 而payScale为SalaryRate类型。其中一个显性给出了标记Enumerated(STRING)来说明枚举类型的值当成字符串使用,而默 认的是从1开始的数字来标识的。也可以通过标记Enumerated(ORDINAL)指示枚举里面类型的值是数字类型的。例如在 EmployeeStatus 中的FULL_TIME, PART_TIME, CONTRACT分别代表的数字是1,2,3,4而SalaryRate 中的JUNIOR, SENIOR, MANAGER, EXECUTIVE代表的分别是字符串“JUNIOR”, “SENIOR”, “MANAGER”, “EXECUTIVE”。 2.13ManyToOne标记 当实体之间的关系是多对一的时候,该标记定义一个单值的字段与其它实体相关联。其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface ManyToOne Class targetEntity() default void.class; CascadeType cascade() default ; FetchType fetch() default EAGER; boolean optional() default true; public enum CascadeType ALL, PERSIST, MERGE, REMOVE, REFRESH; targetEntity:表示相关联的实体类。 Cascade:级联操作选项,PERSIST, MERGE, REMOVE, REFRESH分别对应增加,更新,删除和查找的联级设置选项。如果选择ALL就使得前面这些联级都生效,也就是cascade=ALL 等同于cascade=PERSIST, MERGE, REMOVE,REFRESH Fetch:制定关联实体的加载方式,包括EAGER和LAZY两种方式。当为EAGER选选项的时候,当查询实体的时候会把它相关联的实体实例也加载。 当为LAZY的时候加载实体实例的时候与之相关联的实体实例不会加载,默认为EAGER。 Optional:指定关联实体关系是否可以为空,默认是为true。当为false的时候,那当有实体实例的存在总会有与之相关实体实例的存在。 例如: ManyToOne(optional=flase) JoinColumn(name=CUST_ID, nullable=false, updatable=false) public Customer getCustomer() return customer; 2.14OneToOne标记 标记定义实体一对一关系的联系,通过一个字段来进行关联。其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface OneToOne Class targetEntity() default void.class; CascadeType cascade() default ; FetchType fetch() default EAGER; boolean optional() default true; String mappedBy() default ; 前面四个选项和8.2.13中的意义是一样的。 mappedBy:代表这个属性或域是关系的拥有者,也就是说mappedBy选择应该是在非关系拥有者方才会出现。所谓关系的拥有者就是在表中包含了关 系字段的那张表。 现在假设有实体Customer和实体CustomerRecoder它们之间是一对一的关系,同时实体Customer是关系的拥有者。这个时候通过标 记OneToOne来完成关联,在实体Customer相关代码如下: OneToOne(optional=false) JoinColumn( name=CUSTREC_ID, unique=true, nullable=false, updatable=false) public CustomerRecord getCustomerRecord() return customerRecord; 在实体CustomerRecord相关代码如下: OneToOne(optional=false, mappedBy=customerRecord) public Customer getCustomer() return customer; 因为CustomerRecord是关系的非拥有者所有mappedBy只能在这边出现。 2.15OneToMany标记 用来标记实体之间的一对多的关系,其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface OneToMany Class targetEntity() default void.class; CascadeType cascade() default ; FetchType fetch() default LAZY; String mappedBy() default ; 值得注意的是表示关联实体的集合要使用范形来制定集合内部的关联实体,否则必须要指定targetEntity的实体类型。Fetch类型默认为LAZY 而OneToOne和ManyToOne则默认的为EAGER。 假设现在有实体Customer和Order它们之间的关系是一对多的关系,同时Order是关系的拥有者。 在实体Customer中的代码为: OneToMany(cascade=ALL, mappedBy=”customer”) public Set getOrders() return orders; 在实体Order中的代码为: ManyToOne JoinColumn(name=CUST_ID, nullable=false) public Customer getCustomer() return customer; 2.16JoinTable标记 用来映射多对多和单项的一对多关系,当不是用该标记的时候会根据默认的映射原则产生关系连接表。其定义如下: public interface JoinTable String name() default ; String catalog() default ; String schema() default ; JoinColumn joinColumns() default ; JoinColumn inverseJoinColumns() default ; UniqueConstraint uniqueConstraints() default ; Name:指定连接表的名字。 Catalog:指定表所属的catalog。 Schema:指定表所属的schema。 joinColumns:指定关系拥有方作为外键的主键。 inverseJoinColumns:指定关系非拥有方作为外键的主键。 uniqueConstraints:指定表中的唯一约束。 例如: JoinTable( name=CUST_PHONE, joinColumns= JoinColumn(name=CUST_ID, referencedColumnName=ID), inverseJoinColumns= JoinColumn(name=PHONE_ID, referencedColumnName=ID) ) 上面例子,连接表的名字为CUST_PHONE里面有两个外键,一个来自关系拥有方的主键ID对应外键为CUST_ID;另一个是来自于关系的非拥有方的 主键ID对应外键为PHONE_ID。 2.17ManyToMany标记 标记实体之间的多对多的关系,如果不通过范形来制定集合中的关联实体类型那必须指定相应的关联实体类型。其定义如下: Target(METHOD, FIELD) Retention(RUNTIME) public interface ManyToMany Class targetEntity() default void.class; CascadeType cascade() default ; FetchType fetch() default LAZY; String mappedBy() default ; 各个属性的意义和标记OneToMany是一样的,请参照8.2.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论