hibernate双向关联一对一
在讲解关联关系时我们首先了解几个属性
我们以部门和员工的关系为例讲解一对多关联关系映射时,删除部门时,如果部门有关联的员工且inverse属性为false,那么由于可以维护关联关系,它就会先把关联的员工的外键列设为null值,再删除自己。但是此刻希望删除部门时,就附带着把该部门下的所有员工都删掉,这时就需要引入cascade属性了。
级联(cascade)
当hibernate持久化一个临时对象时,在默认情况下,它不会自动持久化所关联的其他临时对象,而是会抛出TransientObjectException。如果设定many-to-one元素的cascade属性为save-update的话,可实现自动持久化所关联的对象。如:
<many-to-one name="customer"
column="CUSTOMER_ID"
class="..Customer"
cascade="save-update"
not-null="true" />
级联指的是当主控方执行操作时,关联对象(被动方)是否同步执行同一操作。
你可以使用cascade=”all”来指定全部操作都顺着关联关系级联(cascaded)。默认值是cascade=”none”,即任何操作都不会被级联(cascaded)。
在对象/关系映射文件中,用于映射持久化类之间关联关系的元素,如、和都有一个cascade属性。
下面我们来看一下例子
package com.cmh.beans;
import javax.persistence.*;
/**
* Created by mianhai on 2017/2/16.
*/
@Entity
@Table(name="tb_person")
public class Person {
private int personId;
private String personname;
private int personAge;
private Hobby hobby;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getPersonname() {
return personname;
}
public void setPersonname(String personname) {
this.personname = personname;
}
public int getPersonAge() {
return personAge;
}
public void setPersonAge(int personAge) {
this.personAge = personAge;
}
/**
* @OneToOne:一对一关联
* cascade:级联,它可以有有五个值可选,分别是:
* CascadeType.PERSIST:级联新建
* CascadeType.REMOVE : 级联删除
* CascadeType.REFRESH:级联刷新
* CascadeType.MERGE : 级联更新
* CascadeType.ALL : 以上全部四项
* @JoinColumn:主表外键字段
* cid:Person所映射的表中的一个字段
*/
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "hobbyid")
public Hobby getHobby() {
return hobby;
}
public void setHobby(Hobby hobby) {
this.hobby = hobby;
}
}
下面使我们的从表
package com.cmh.beans;
import org.springframework.boot.autoconfigure.web.ResourceProperties;
import javax.persistence.*;
/**
* Created by mianhai on 2017/2/16.
*/
@Entity
@Table(name="tb_hobby")
public class Hobby {
private int hobbyid;
private String name;
private Person person;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getHobbyid() {
return hobbyid;
}
public void setHobbyid(int hobbyid) {
this.hobbyid = hobbyid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* @OneToOne:一对一关联
* mappedBy = "hobby":意思是说这里的一对一配置参考了hobby
* hobby又是什么呢?hobby是Person类中的getHobby(),注意不是Person类中的
* hobby属性,Person类中的OneToOne配置就是在getHobby()方法上面配的.
* 如果Person类中的getHobby()方法改成getIdHobby(),其他不变的话,
* 这里就要写成:mappedBy = "idHobby"
*/
@OneToOne(mappedBy = "hobby")
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
运行生成的表
Hibernate: create table tb_hobby (hobbyid integer not null auto_increment, name varchar(255), primary key (hobbyid))
Hibernate: create table tb_person (person_id integer not null auto_increment, person_age integer not null, personname varchar(255), hobbyid integer, primary key (person_id))
测试实例
@Test
@Transactional
public void testOneToOne(){
Hobby hobby = new Hobby();
Person person = new Person();
hobby.setName("pingpong");
person.setPersonAge(12);
person.setPersonname("22z");
person.setHobby(hobby);
en.persist(person);
}
Hibernate: insert into tb_hobby (name) values (?)
Hibernate: insert into tb_person (hobbyid, person_age, personname) values (?, ?, ?)