hibernate一对一的单向和双向关系
单向的意思:保存的关系维护者,做的任何操作,都会影响,另外一个实体。
操作包含 4种 增加 删除 修改 查询
双向的意思:可以随便通过一方去操作另外一方
@Data get 和set 方法 重写hashcode 和equals方法 重写toString方法
如:
mouth类是关系非维护者
Person2是关系维护者
单向关联:
如:在关系维护端添加
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "mid",nullable = false,unique = true)
private Mouth mouth;
双向关系:
1.重写toString方法 toString只要有基本数据类型即可
2.在关系维护端(有外键的实体) One2One() 取消该nullabled
如:在关系维护端添加
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "mid",unique = true)
private Mouth mouth;
在非关系维护端:
@OneToOne(mappedBy = "mouth",cascade = CascadeType.ALL)
private Person2 person;
A.所谓双向相关 在非关系维护端 添加@OneToOne的主键
定义一个属性mappedby(被映射)
mappedby里面写的是 当前该属性的返回值类型的外键关联属性
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "mid",unique = true)
private Mouth mouth;
在非关系维护端:
@OneToOne(mappedBy = "mouth",cascade = CascadeType.ALL)
private Person2 person;
B.mappedby的意思 就是表示 我不维护关系 由你定义的这个属性来维护关系
(mappedby="Person.mouth") person.mouth 由Person类的mouth属性来维护
C.既然不维护关系 所以在新增数据的数据 如果你当前新增的数据是非关系维护端
不维护关系 所以在做级联操作的时候,而只会保存数据,不会建立关系,
注:无论在单向还是双向 必须保存关系维护端 才会建立关联关系
例子:双向外键关联-保存关系维护端
mouth类是关系非维护者
Person2是关系维护者
package com.oracle.bean2; import lombok.Data; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @Data @Entity public class Person2 { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid",strategy = "uuid") private String pid; private String pname; @OneToOne(cascade = CascadeType.ALL) //@JoinColumn(name = "mid",nullable = false,unique = true) @JoinColumn(name = "mid",unique = true) private Mouth mouth; @Override public String toString() { return "Person2{" + "pid='" + pid + '\'' + ", pname='" + pname + '\'' + '}'; } }
package com.oracle.bean2; import lombok.Data; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; //@Data get 和set 方法 重写hashcode 和equals方法 重写toString方法 @Entity @Data public class Mouth { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid",strategy = "uuid") private String mid; private String color; private String type; @OneToOne(mappedBy = "mouth",cascade = CascadeType.ALL) private Person2 person; @Override public String toString() { return "Mouth{" + "mid='" + mid + '\'' + ", color='" + color + '\'' + ", type='" + type + '\'' + '}'; } }
保存维护关系的增删查改
package com.oracle.core; import com.oracle.bean2.Mouth; import com.oracle.bean2.Person2; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; public class One2oneTest { private SessionFactory sessionFactory; private Session session; @Before public void begin(){ org.hibernate.cfg.Configuration cfg=new org.hibernate.cfg.Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); session = sessionFactory.openSession(); session.beginTransaction(); } //增加 @Test public void one2onesave(){ Person2 person=new Person2(); person.setPname("糖宝"); Mouth mouth=new Mouth(); mouth.setColor("红色"); mouth.setType("小"); person.setMouth(mouth); session.save(person); } @Test public void delete(){ Mouth mouth = session.get(Mouth.class, "8a8aac9463859f500163859f54070001"); session.delete(mouth); } //修改 @Test public void update(){ Mouth mouth = session.get(Mouth.class, "8a8aac9463859f500163859f54070001"); mouth.getPerson().setPname("小妖王"); session.update(mouth); } //查询 @Test public void query(){ Mouth mouth = session.get(Mouth.class, "8a8aac9463859f500163859f54070001"); System.out.println(mouth.getPerson()); } @After public void end(){ session.getTransaction().commit(); session.close(); sessionFactory.close(); } }
保存非维护关系的
package com.oracle.core; import com.oracle.bean2.Mouth; import com.oracle.bean2.Person2; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; public class One2oneTest2 { private SessionFactory sessionFactory; private Session session; @Before public void begin(){ org.hibernate.cfg.Configuration cfg=new org.hibernate.cfg.Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); session = sessionFactory.openSession(); session.beginTransaction(); } @Test public void one2one2(){ Person2 person=new Person2(); person.setPname("妖王"); Mouth mouth=new Mouth(); mouth.setColor("红色"); mouth.setType("大"); mouth.setPerson(person); session.save(mouth); } @After public void end(){ session.getTransaction().commit(); session.close(); sessionFactory.close(); } }