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; }