今天开始学学JPA2.0 ~~
实体类
package com.neal.bean.test;
import java.util.List;
import java.util.Set;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.OrderBy;
@Entity
public class Vehicle {
@Id
int vin;
@ElementCollection
@CollectionTable(name = "VEH_OPTNS")
@Enumerated()
@Column(name = "FEAT")
Set<FeatureType> optionalFeatures;
@ElementCollection
@CollectionTable(name = "VEH_SVC")
@OrderBy("serviceDate")
List<ServiceVisit> serviceHistory;
public enum FeatureType {
AC, CRUISE, PWR, BLUETOOTH, TV
}
}
package com.neal.bean.test;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Embeddable
public class ServiceVisit{
@Temporal(TemporalType.DATE)
@Column(name="SVC_DATE")
Date serviceDate;
String workDesc;
int cost;
}
数据库生成表都在下面, 一些表名这类的的 大小写就不用太计较了。。哈~
第一个注解:@Entity 这玩意不用说,对应的表就是 vehicle , @ID生成如下主键 vin这些都是基本的,现在开始下面的注解
@ElementCollection
@CollectionTable(name = "VEH_OPTNS")
个人理解为:这个有点像一对多~~ 嵌入 一张表 表名为VEH_OPTNS,对应FeatureType枚举,再生成一张表,用来存放枚举数据,而不是和JPA1 里面用字段来存放枚举数值,VEH_OPTNS中的Vechicle_vin ,根据外键名自动生成。 外键关联到 Vehicle 表中的vin字段 的主键上,也就是以嵌入式的方式生成一个枚举表,不过个人觉得这个样子还不如直接定义枚举,多表查询,速度可想而知。
第二个应该才是嵌入式的该用到的地方了~ 大概也和上面一样,我就不细说了。生成表 VEH_SVC,表内数据其实就是 ServiceVisit 中的内容,之后还是主外键关联。
总结: 其实也就是一对多的变种而已。。 嵌入一些信息,把原先那些枚举这类的也看成为一个对象,用一个表格存储,1.0 的时候就是一个字段而已,更加面向对象了。 两张表与主表Vehicle 之间有主键的关联,自动生成的表主键似乎无法修改,谁知道了也回复一下啊。
敲完手工。。。 下午继续研究其他特性。
数据库生成如下三张表: