一、OnToMany 和 ManyToOne
PO:Book和Comment, 1个Book包含了多条评论(Comment),这个时候需要用到一对多和多对一的映射实现数据的加载。
@Entity @Table(name="t_book") public class Book { @OneToMany(cascade=CascadeType.ALL,mappedBy="book", fetch = FetchType.LAZY) @OrderBy("id") private List list; //其他属性省略了 }
@Entity @Table(name = "t_comment") class Comment{ @ManyToOne(targetEntity = Book.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "fk_b_id") private Book book; //其他属性省略了 }
二、OneToOne
如果一对一的映射关系时,如PO:User和PO:UserInfo。可使用主键生成策略。使用@PrimaryKeyJoinColumn或者@JoinColumn(name = "外键字段名")都可以。
A 使用@JoinColumn(name = "外键字段名"),但主表中会成额外的数据列(字段u_id)
B 两个实体通过主键关联时使用@PrimaryKeyJoinColumn,不会成额外的数据列。
注: 1. mappedBy=外键属性名
2. @OrderBy(外键属性名)
3. 注解要么全写在属性上方,要么全写在getter上面,混合写法会报错:org.hibernate.MappingException: Could not determine type for: java.util.List, at table: t_book, for columns: [org.hibernate.mapping.Column(list)]
4.@PrimaryKeyJoinColumn[/size]不仅可以与@OneToOne注释使用,还可以与其他标记同时使用。其中optional很重要,指定关联属性不能为空,如果想要实现延迟加载就一定要将这个属性设置为false,