【问题标题】:JPA Annotation @OneToMany relation distinct recordsJPA注释@OneToMany关系不同记录
【发布时间】:2017-01-18 22:24:31
【问题描述】:

我有两个实体 - 软件和员工 - 具有 oneToMany 关系,它们处于同一级别。

@Entity(name = "EMPLOYEE") 
public class Employee {

        private long employeeId;
        private String firstName;
        private String lastName;
        private List<Software> software;


        @Id //signifies the primary key
        @Column(name = "EMPLOYEE_ID", nullable = false)
        @GeneratedValue(strategy = GenerationType.AUTO)
        public long getEmployeeId() {
            return employeeId;
        }

        public void setEmployeeId(long employeeId) {
            this.employeeId = employeeId;
        }

        @Column(name = "FIRST_NAME", length = 50)
        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        @Column(name = "LAST_NAME", nullable = false,length = 50)
        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        @OneToMany(
              fetch = FetchType.EAGER,
              cascade = CascadeType.ALL,
              orphanRemoval = true,
              targetEntity = Software.class)
        @Fetch(FetchMode.SUBSELECT)
        public List<Software> getSoftware() {
            return software;
        }

        public void setSoftware(Software software) {
            this.software = software;
        }
}

软件类

@Entity(name = "SOFTWARE") 
public class SOFTWARE {

    private long softwareId;
    private String softwareName;
    private String version; 
    private Employee emp;

    @Id 
    @Column(name = "SOFTWARE_ID", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getSoftwareId() {
        return softwareId;
    }

    public void setSoftwareId(long softwareId) {
        this.softwareId = softwareId;
    }

    @Column(name = "SOFTWARE_NAME")  
    public String getSoftwareName() {
        return softwareName;
    }

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

    @Column(name = "SOFTWARE_VERSION")  
    public String getSoftwareVersion() {
        return softwareDesc;
    }

    public void setSoftwareVersion(String version) {
        this.version = version;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "EMPLOYEE_ID", nullable = true)
    public String getEmployee() {
        return emp;
    }

    public void setEmployee(Employee emp) {
        this.emp = emp;
    }
}

这个想法是有一个带有软件列表的 gui,可以在其中删除、添加记录并分配给每个员工。

在我的情况下,我将有重复的软件记录,这些记录仅在员工 ID 上有所不同。问题是如果我编辑一条记录,它不会影响所有记录,如果我删除关系,我不想删除记录本身,因为如果它被删除,我无法将此软件分配给其他员工。

这是正确的方法还是可以通过创建第三个表使用@JoinTable 解决问题? 有人有想法吗?

【问题讨论】:

  • 不要使用 CascadeType.ALL

标签: java hibernate jpa persistence one-to-many


【解决方案1】:

不要使用CascadeType.ALL。这将包括级联删除操作,效果是,如果您删除员工,相关的软件记录也将被删除。我会从没有级联开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 2017-05-22
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多