2017-01-18 7 views
0

나는 소프트웨어와 직원이라는 두 개의 엔티티가 oneToMany 관계로 있으며 같은 레벨에 있습니다.JPA 주석 @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; 
     } 
} 

Software.class

@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를하는 것입니다.

enter image description here

내 경우에는 내가 단지 employee_id입니다 다를 중복 소프트웨어 기록을해야합니다. 문제는 내가 모든 레코드에 영향을 미치지 않을 레코드를 편집하고 관계를 삭제하는 경우 삭제 된 경우이 소프트웨어를 다른 직원에게 할당 할 수 없기 때문에 레코드 자체를 삭제하지 않기를 바라는 것입니다.

제 3의 테이블을 작성하여 올바른 방법입니까, 아니면 @JoinTable을 사용하여 문제를 해결할 수 있습니까? 누군가 아이디어가 있습니까?

+0

CascadeType.ALL을 사용하지 마십시오. – Mehdi

답변

1

CascadeType.ALL을 사용하지 마십시오. 여기에는 제거 작업을 효과와 함께 계단식으로 포함하고 직원을 삭제하면 관련 소프트웨어 레코드도 삭제됩니다. 캐스케이드를 전혀 사용하지 않아도됩니다.