2017-01-18 12 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; 
    } 
} 

Идея заключается в том, чтобы иметь графический интерфейс со списком программного обеспечения, где записи могут быть удалены, добавлены и присвоенным каждому сотруднику.

enter image description here

В моем случае я буду иметь дублирующие записи программного обеспечения, которые отличаются только в employee_id. Проблема в том, что если я отредактирую запись, это не повлияет на все записи, и если я удалю взаимосвязь, я не захочу удалить запись как сам, потому что, если она удалена, я не могу назначить это программное обеспечение другому сотруднику.

Правильно ли это или можно решить проблему с помощью @JoinTable, создав третью таблицу? Есть ли у кого-то идеи?

+0

Не использовать CascadeType.ALL – Mehdi

ответ

1

Не использовать CascadeType.ALL. Это будет включать в себя каскадирование операции удаления с эффектом, что при удалении сотрудника соответствующие записи программного обеспечения также будут удалены. Я бы начал без каскада вообще.