3. 每個具體類一張表 在父類中 @Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public class User { @Id @GeneratedValue(strategy=GenerationType.TABLE,generator="xxGen") @TableGenerator(name="xxGen",allocationSize=1) private Long id; ... } 在子類中跟普通實體類的映射相同
2017-04-03
1. 使用Hibernate Annotation來做對象關系映射
1) 添加必須包:
? ?hibernate-jpa-2.0-api-1.0.0.Final.jar
2) 在實體類中添加JPA的標準注解來進行對象關系映射.注解可以添加在屬性上,也可以添加在getXxx()方法之上。
? ?a) @Entity 映射一個實體類
? ? ? @Table 指定關聯的表
? ?b) @Id 映射OID
? ?c) @GeneratedValue 指定OID的生成策略
? ?d) @Version 映射版本號屬性
? ?e) @Column 指定屬性對應的列的信息
? ?f) @Temporal 指定日期時間的類型(TIMESTAMP,DATE,TIME)
? ?g) 簡單屬性可以不用注解。默認就是@Basic
? ?h) @Transient 指定屬性不需要映射
? ?i) 復雜屬性:關聯,繼承,組件,聯合主鍵,集合
? ?
3) 在Hibernate全局配置文件中使用聲明映射類的方式:
? ?<mapping class="實體類的全限定名"/>
? ?
4) 使用Annotation來映射對象關系時,加載Hibernate全局配置要使用AnnotationConfiguration類
5) 持久化操作與之前沒有區別。
2. Hibernate Annotation 基本映射
?
3. 映射多對一
?1) @ManyToOne
?2) 指定關聯列@JoinColumn(name="xxx_id")
?
4. 映射一對多
?1) @OneToMany ?默認會使用連接表做一對多的關聯
?2) 添加@JoinColumn(name="xxx_id")后,就會使用外鍵關聯,而不使用連接表了。
5. 映射雙向一對多
?1) 在多端:
? ? @ManyToOne
?2) 在一端:
? ? @OneToMany(mappedBy="多端的關聯屬性名"):----升級后--> ?@OneToMany
? ? @JoinColumn(name="外鍵名")
? ?
6. cascade屬性:指定級聯操作的行為(可多選)
? CascadeType.PERSIST :調用JPA規范中的persist(),不適用于Hibernate的save()方法
? CascadeType.MERGE:調用JPA規范中merge()時,不適用于Hibernate的update()方法
? CascadeType.REMOVE:調用JPA規范中的remove()時,適用于Hibernate的delete()方法
? CascadeType.REFRESH:調用JPA規范中的refresh()時,適用于Hibernate的flush()方法
? CascadeType.ALL:JPA規范中的所有持久化方法。
?
7. mappedBy屬性:用在雙向關聯中,把關系的維護權反轉
? ? ? 跟hibernate XML映射中的property-ref一樣。
?
8. cascade屬性和mappedBy用在一起時,一定要通過調用雙方的set方法來建立關系。
10. 雙向一對一
?1) 基于外鍵
? ?a) 在主控方:@OneToOne
? ?b) 在被控方:@OneToOne(mappedBy="對方的關聯屬性名")
? ?
?2) 基于主鍵: JPA標準中沒有提供共享主鍵生成問題的標準方法,使用Hibernate的擴展
? ?a) 在主控方:Car
? ? ? @Id
?@GeneratedValue(generator="my-uuid")
?@GenericGenerator(name="my-uuid", strategy="uuid")
?private String id;
?
?@OneToOne(cascade={CascadeType.ALL})
?@PrimaryKeyJoinColumn
?private Brand brand;
b) 在被控方:Brand
?@Id
?@GeneratedValue(generator="myFG")
?@GenericGenerator(name="myFG", strategy="foreign",parameters=@Parameter(name="property",value="car"))
?private String id;
?
?@OneToOne(mappedBy="brand")
?private Car car;
11. 雙向多對多
?1. 在主控方:
? ?//從學生到課程的多對多: 最好由某一端來維護這個關系會更有效率
@ManyToMany
@JoinTable(name="student_course",
joinColumns={@JoinColumn(name="student_id")},
inverseJoinColumns={@JoinColumn(name="course_id")})
private Set<Course> courseSet = new HashSet<Course>();
?2. 在被控方:
? ?//課程到學生的多對多
@ManyToMany(mappedBy="courseSet")
private Set<Student> stus = new HashSet<Student>();
12. 把雙向多對多拆成兩個一對多: 1-->*<--1
13. 繼承映射:
1. 整個繼承樹一張表
在父類中添加從下注解
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",length=3)
@DiscriminatorValue("u")
子類中添加以下注解
@Entity
@DiscriminatorValue("w")
2. 每個子類一張表
在父類添加如下注解
@Entity
@Table(name="user")
@Inheritance(strategy=InheritanceType.JOINED)
在子類中跟普通實體類的映射相同
3. 每個具體類一張表
在父類中
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class User {
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="xxGen")
@TableGenerator(name="xxGen",allocationSize=1)
private Long id;
...
}
在子類中跟普通實體類的映射相同
14. 組件映射
?在組件類中用@Emabbedable
在使用這個組件類中用
@Emabbed
@AttributeOverrides({
@AttributeOverride(name="email", column=@Column(name="p_email")),
@AttributeOverride(name="address", column=@Column(name="p_address")),
@AttributeOverride(name="mobile", column=@Column(name="p_mobile"))
})
15. 聯合主鍵映射
?1. 主鍵類:用@Emabbedable映射。并實現Serializable接口,使用主鍵屬性重寫hashCode()和equals()方法。
?2. 使用這個主鍵類的類中。用@Id映射。