一 @OneToMany,@ManyToOne注释的使用
@Entity
public class Employee {
@Id
@Column(name="EMP_ID")
private long id;
...
@OneToMany(mappedBy="owner")
private List<Phone> phones;
...
}
@Entity
public class Phone {
@Id
private long id;
...
@ManyToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
@JoinColumn(name="OWNER_ID")
private Employee owner;
...
}
fetch 加载类型,默认情况一的方为立即加载,多的一方为延迟加载
fetch=FetchType.LAZY的意思是select的时候懒加载,当加载phone这个对象的时候,会加载他的属性,如id,firstname,lastname,但是不会去加载owner的属性。如果不设置fetch=FetchType.LAZY,则默认是eager,不仅会加载id,firstname,lastname等属性,而且会加载owner里面的属性。
JoinColumn指的是Phone(多)表对应Employee(一)表关联字段的名称。
cascade: 级联类型
Java持久性体系结构支持的级联类型如下:
CascadeType.PERSIST:级联类型presist表示save()或persist()操作级联到相关实体。
CascadeType.MERGE:级联类型merge表示合并拥有的实体时合并相关的实体。
CascadeType.REFRESH:级联类型refresh对refresh()操作执行相同的操作。
CascadeType.REMOVE:级联类型在remove删除拥有实体时会删除与此设置关联的所有相关实体。
CascadeType.DETACH:detach如果发生“手动分离”,则级联类型分离所有相关实体。
CascadeType.ALL:级联类型all是上述所有级联操作的简写。
注意: JPA中没有默认的级联类型。默认情况下,没有操作级联。
mappedBy 关系维护
mappedBy= “parent” 表示在ListEntity类中的 parent 属性来维护关系,这个名称必须和ListEntity中的parent属性名称完全一致才行
OneToMany必须写mappedBy,不然会多生成一张没用的中间表,因为如果没写mappedBy,JPA不知道具体怎样做关联
JoinColumn
@JoinColumn与@Column标记一样,是用于注释表中的字段的。它的属性与@Column属性有很多相同之处,例如name属性是用来标识表中所对应的字段的名
称,其它的不再详述。
@JoinColumn与@Column相区别的是:@JoinColumn注释的是保存表与表之间关系的字段,它要标注在实体属性上(相当于外键)。而@Column标注的是表中不包含表关系的字段。
参考:
https://en.wikibooks.org/wiki/Java_Persistence/OneToMany
https://howtodoinjava.com/hibernate/hibernate-jpa-cascade-types/
https://www.cnblogs.com/xuwenjin/p/8831129.html (简单)