导航属性
单向关系 双向关系
双向一对多关系
关系维护端【多方】 关系被维护端【单方】
下图为双向一对多关系
@Entity
public class BannerItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String img;
private String keyword;
private Short type;
private String name;
private Long bannerId;
@ManyToOne
@JoinColumn(foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT), insertable = false, updatable = false,name = "bannerId")
private Banner banner;
}
@Entity
@Table(name="banner")
public class Banner {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(length = 16)
private String name;
@Transient
private String description;
private String img;
private String title;
// 关系的被维护端
@OneToMany(mappedBy = "banner", fetch = FetchType.EAGER)
@org.hibernate.annotations.ForeignKey(name="null") // 禁止外键生成
private List<BannerItem> items;
}
双向一对多关系中 多方可以额外添加上外键,例如
但是,JoinColumn注解【代表数据表中的外键】必须如下:
@ManyToOne
@JoinColumn(insertable=false, updatable=false, name="lkm_cust_id")
禁止JPA生成物理外键:在多方@JoinColumn中添加foreignKey=@ForeignKey(value=ConstraintMode.NO_CONSTRAINT)
最好的方式是自己手动创建数据表,就不需要考虑禁止生成物理外键了。
【大部分时候单向关系足以完成业务逻辑】
双向多对多
@JoinTable指定第三张关系表
@Entity
public class Spu {
@Id
private Long id;
private String title;
private String subtitle;
@ManyToMany(mappedBy = "spuList")
private List<Theme> themeList;
}
@Entity
public class Theme {
@Id
private Long id;
private String title;
private String name;
@ManyToMany
@JoinTable(name = "theme_spu", joinColumns = @JoinColumn(name = "theme_id"),
inverseJoinColumns = @JoinColumn(name = "spu_id"))
private List<Spu> spuList;
}