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);
复制代码
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值