2017-01-18 4 views
0

Ich habe zwei Entitäten - Software und Mitarbeiter - mit einer oneToMany Beziehung und sie sind auf dem gleichen Niveau.JPA Annotation @ OneToMany Beziehung unterschiedliche Datensätze

@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; 
    } 
} 

Die Idee ist es, eine gui mit einer Liste der Software zu haben, wo Aufzeichnungen gelöscht werden konnte, hinzugefügt und für jeden Mitarbeiter zugeordnet.

enter image description here

In meinem Fall werde ich doppelten Software-Datensätze, die nur im employee_id unterscheiden. Das Problem ist, wenn ich einen Datensatz bearbeite, wird es nicht alle Datensätze beeinflussen und wenn ich die Beziehung löschen möchte ich nicht den Datensatz als selbst löschen, denn wenn es gelöscht wird, konnte ich diese Software nicht zu einem anderen Mitarbeiter zuweisen.

Ist das der richtige Weg oder könnte das Problem mit @JoinTable durch Erstellen einer dritten Tabelle gelöst werden? Hat jemand eine Idee?

+0

Verwenden Sie nicht CascadeType.ALL – Mehdi

Antwort

1

Verwenden Sie nicht CascadeType.ALL. Dies beinhaltet eine Kaskadierung der Entfernungsoperation mit dem Effekt, dass wenn Sie einen Mitarbeiter löschen, die zugehörigen Software-Datensätze ebenfalls gelöscht werden. Ich würde mit keiner Kaskade anfangen.

Verwandte Themen