2012年1月6日星期五

OEPE_006:Trouble Ticket System 项目实战开发之JPA:根据数据库表创建JPA Entity

开发运行环境:OEPE 12c(12.1.1.1.0)+ WebLogic Server 12c(12.1.1.1.0)+ Oracle Database 10g Express Edition 10.2.0.1

创建JPA Entities有两种方式,一种是根据数据库表来创建,另一种是根据POJO类来创建。
我们先介绍第一种,再介绍第二种。

1.  右键TroubleTicketSystemServer,选择JPA Tools,选择Generate Entities from Tables


2.  选择除Department表以外的其它表,Department Entity我们将通过POJO类创建。


 3.  默认自动关联的Table Association


 4.  选择TECHNICIANPRIVATEDATA 和 TECHNICIAN 关联关系
取消勾上Generate this association,因为我们不想建立二者之间一对多的关联关系,之后会手工建立二者之间一对一的关联关系。

 5.  选择TICKETHISTORY 和 TECHNICIAN 关联关系
取消勾上Generate a reference to a collection of TICKETHISTORY in TECHNICIAN,因为我们不想在TECHNICIAN中有TICKETHISTORY 集合对象。
也就是说,二者是一个单向一对多的关系。



6.  选择TICKETHISTORY 和 TICKET 关联关系
 修改Property,把tickethistories 改为ticketHistory,这样更符合Java命名规范。


7.  点击绿色的加号,手工建立TECHNICIANPRIVATEDATA 和 TECHNICIAN 关联关系
(1)选择Simple association,并选择相应的表
(2)选择两个表的关联主键
(3)选择一对一的关联关系


 8. 准备生成Entity的Java类
(1)Collection类型选择Set,并设置package路径
(2)默认要生成的Entities
 (3)修改不符合Java规范的类名。
 (4)修改不符合Java规范的变量名。

 9. 查看生成的Entity Java类
(1)@Basic批注
不带批注的Property,默认是@Basic类型
(2)@Column批注
表示对应数据库表中的字段,包括名称、是否唯一、长度、是否允许为null。
(3)@Id批注
表示主键
(4)@OneToOne批注 
表示一对一的关联关系,
其中在源方Entity定义中后面跟@JointColumn 批注,表示与目标Entity中关联的数据库字段;
比如在TechnicianPrivateData.java中:
//bi-directional one-to-one association to Technician
@OneToOne
@JoinColumn(name="ID")
private Technician technician;
在目标方Entity定义中会使用mappedBy来指向源方引用的属性名称。
比如在Technician.java中:
// bi-directional one-to-one association to TechnicianPrivateData
@OneToOne(mappedBy = "technician")
private TechnicianPrivateData technicianPrivateData;
(5)@OneToMany批注
表示一个Entity A可以有多个Entity B;但是两个 Entity B 不可以被同一个 Entity A引用 。
比如一个Technician可以有多个Tickets,但是一个Ticket只能被一个Technician引用。
比如在Technician.java中:
// bi-directional many-to-one association to Ticket
@OneToMany(mappedBy = "technician")
private Set tickets;
(6)@ManyToOne批注
表示多个Entity A可以被同一个Entity B引用。
比如在Ticket.java中:
//bi-directional many-to-one association to Technician
@ManyToOne
@JoinColumn(name="TECHNICIANID")
private Technician technician;
在@ManyToOne批注中还可以定义FetchType,可以设置的值有FetchType.EAGER(默认),FetchType.LAZY。

没有评论: