JPA一对多,多对一,多对多关系绑定

OneToOne

public class Wife {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
//注意:由于是双向的一对一关系。作为关系的被维护端。需要在wife实体中添加和 husband 关联的属性
//mappedBy 注释:指定了,这个实体是被关系维护端的那个属性所维护。
//在本例中,Wife实体是被 Husband实体中的属性为wife的外键“wife_fk”所维护。
@OneToOne(mappedBy = “wife”)
private Husband husband;
}

 

public class Husband {
@Id  //JPA注释: 主键
@GeneratedValue(strategy = GenerationType.AUTO)   //设置 id 为自增长
private Long id;
private String name;
//由于husband 是这个一对一的关系的主控方,所以,在husband表中添加了一个 wife 的外键,实际表中没有这个字段。
//通过这个外键来维护 由于husband和wife的一对一关系,而不是用第三张表,这个是通过@JoinColumn注释实现的。
@OneToOne(cascade = CascadeType.REMOVE) //JPA注释: 一对一 关系,配置级联操作:删除
@JoinColumn(name=”wife_fk” )// 在husband中,添加一个外键 “wife_fk”
private Wife wife;

@RequestMapping(“/onetoone/add”) 测试方法:
public void testCreate() {
Husband wang = new Husband();
wang.setName(“老王”);
Wife li = new Wife();
li.setName(“莉莉”);
//由于关系是双向的,所以,你不必手动的来设置“莉莉”的丈夫。JPA会自动完成这个操作。所以,即使将这个操作注释掉,双向关系还是会正确的建立的。
wifeRepository.save(li);
//将“莉莉” 交给 “老王”。
//但是,这一步,就不可以省略了。必须得手动的或者说显式的设置“老王”和“莉莉”的关系。如果,你省略了这一步,那么就没法建立起 “老王” 和 “莉莉” 的你一对一关系了,无论是双向的还是单向的。
wang.setWife(li);
//此时,老王 和 莉莉 ,已经是双向的一对一关系了。通过他俩任何一方,都可以找到另一个对象。
husbandRepository.save(wang);
}
@RequestMapping(“/onetoone/find”)
public void find() {
Husband husband = husbandRepository.findByName(“老王”);
System.out.println(husband.getWife().getName());
Wife wife=wifeRepository.findByName(“莉莉”);
System.out.println(wife.getName()+”–“+wife.getHusband().getName());
}
@RequestMapping(“/onetoone/delete”)
public void delete() {
Husband husband = husbandRepository.findByName(“老王”);
// husbandRepository.delete(husband);//会报错
Wife wife=wifeRepository.findByName(“莉莉”);
husband.setWife(null);
wifeRepository.delete(wife);

 

 

OneToMany和ManyToOne

public class Phone {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String code;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = “OWNER_ID”)
private Employee owner;
}public class Employee {
@Id
@Column(name = “EMP_ID”)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@OneToMany(mappedBy = “owner”)
private List<Phone> phones;
}//测试方法

@RequestMapping(“/onetomany/add”)
public void add() {
Employee employee = new Employee();
employee.setName(“wll”);
Phone p1 = new Phone();
p1.setCode(“180122222”);
p1.setOwner(employee);
Phone p2 = new Phone();
p2.setCode(“180133333”);
p2.setOwner(employee);
empRepository.save(employee);
phoneRepository.save(p1);
phoneRepository.save(p2);

ManyToMany

public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = “Per_Pro”, //name 是新建中间表的表名称
joinColumns = @JoinColumn(name = “Per_ID”, referencedColumnName = “id”), //name=Per_ID意思是新建中间表的字段,
// referencedColumnName = “id”意思是新建中间表的字段来源于当前表哪个字段
inverseJoinColumns = @JoinColumn(name = “Pro_ID”, referencedColumnName = “id”))//referencedColumnName=id是关联另一个表的字段
private List<Project> projects;

public class Project {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String projectname;
@ManyToMany(mappedBy=”projects”)//表明当前表不是关系的维护者
private List<Person> people;

 

小站主要是个人在开发过程中遇到的问题,解决方案的记录,与君分享。
vsalw技术博客 » JPA一对多,多对一,多对多关系绑定

提供最优质的资源集合

立即查看 了解详情