JPA OneToMany級聯更新 及 orphanRemoval = true 說明

 

下面是一個例子:

Employee ---- Address (假設爲單向one-to-many)
class Employee {
@oneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)
@JoinTable(JoinColumn="Employee_id")
private Set<Address> addresses;
// [當Employee和Address均處於關聯時]這種場合設置cascade和orphanRemoval是一樣的效果,只要設置一種就好

// [當Employee和Address均不處於關聯時,比如設置address中某條數據爲空, 僅設置Cascade=Remove時,當操作到Employee只會將其對應的Address刪掉
// 設置orphanRemoval=true時,會將FK上Null對應的數據都會刪掉(自動去孤子)

}
注意加入的位置
只能在one的一方設置orphanRemoval
cascade所有關係都可設置



oneToMany 使用:

示例:Employee與Phone爲例.

1、類定義如下:

複製代碼
package com.vrvwh.wh01.domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by Administrator on 2015/3/5.
 */
@Entity
public class Employee {
    private long id;

    private String name;

    private Set<Phone> phones=new HashSet<Phone>();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Column
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

  /**orphanRemoval=true配置表明刪除無關聯的數據。級聯更新子結果集時此配置最關鍵
  */ @OneToMany(mappedBy
= "employee",cascade = CascadeType.ALL,orphanRemoval = true) public Set<Phone> getPhones() { return phones; } public void setPhones(Set<Phone> phones) { this.phones = phones; } }

複製代碼
複製代碼
package com.vrvwh.wh01.domain;

import javax.persistence.*;

/**
 * Created by Administrator on 2015/3/5.
 */
@Entity(name="Phones")
public class Phone {
    @Id
    private int phoneId;
    private int phoneNumber;

    @ManyToOne(cascade= CascadeType.ALL)
    private Employee employee;

    public int getPhoneId() {
        return phoneId;
    }
    public void setPhoneId(int phoneId) {
        this.phoneId = phoneId;
    }
    public int getPhoneNumber() {
        return phoneNumber;
    }
    public void setPhoneNumber(int phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
    public Employee getEmployee() {
        return employee;
    }
    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

}
複製代碼

2、更新:

複製代碼
Employee employee=employeeService.query(1);
        employee.getPhones().clear();
        Phone phone1=new Phone();
        phone1.setPhoneNumber(132567);
        employee.getPhones().add(phone1);
        Phone phone2=new Phone();
        phone2.setPhoneNumber(132567);
        employee.getPhones().add(phone2);
        employeeService.update(employee);
複製代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章