2015-05-21 3 views
0

Я использую стандартный способ Hibernate от многих до многих отношений. Например, сотрудник с совещаниями следующим образом:Hibernate - много для многих - с таблицей констант

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

    @Id 
    @Column(name="EMPLOYEE_ID") 
    @GeneratedValue 
    private Long employeeId; 

    @Column(name="FIRSTNAME") 
    private String firstname; 

    @ManyToMany(cascade = {CascadeType.ALL}) 
    @JoinTable(name="EMPLOYEE_MEETING", 
       joinColumns={@JoinColumn(name="EMPLOYEE_ID")}, 
       inverseJoinColumns={@JoinColumn(name="MEETING_ID")}) 
    private Set<meeting> meetings = new HashSet<meeting>(); 

    public Employee() { 
    } 

    public Employee(String firstname) { 
     this.firstname = firstname;    
    } 
} 

и встречи:

@Entity 
@Table(name="MEETING") 
public class Meeting { 

    @Id 
    @Column(name="MEETING_ID") 
    @GeneratedValue 
    private Long meetingId; 

    @Column(name="SUBJECT") 
    private String subject; 

    @ManyToMany(mappedBy="meetings") 
    private Set<employee> employees = new HashSet<employee>(); 

    public Meeting(String subject) { 
     this.subject = subject;    
    } 
} 

Главный фрагмент кода:

 Meeting meeting1 = new Meeting("Constant Subject"); 
     Meeting meeting2 = new Meeting("Constant Subject"); 

     Employee employee1 = new Employee("Sergey"); 
     Employee employee2 = new Employee("Larry"); 

     employee1.getMeetings().add(meeting1);    
     employee2.getMeetings().add(meeting2); 

     session.save(employee1); 
     session.save(employee2); 

Пожалуйста, учтите, что я специально создал два собрания объекты с постоянным именем. В этом случае СОВЕЩАНИЕ ТАБЛИЦА будет сохраняться два разных строками групп, например:

 MEETING          EMPLOYEE_MEETING 
    Meeting_Id Subject       Employee_Id Meeting_Id 
    1   Constant Subject     1    1 
    2   Constant Subject     2    2 

Поскольку у меня будет всего лишь несколько постоянных значений как соответствующие тематики я хотел бы предотвратить дубликаты, и после выполнения той же коды, чтобы иметь такая ситуация:

MEETING          EMPLOYEE_MEETING 
    Meeting_Id Subject       Employee_Id Meeting_Id 
    1   Constant Subject     1    1 
                2    1 

Я хочу Hibernate, чтобы понять, что таблица собрание набор констант, а не дублировать строки, если не neccesarry. Я пробовал с уникальным ограничением, но это не помогло. Есть ли способ достичь этого?

ответ

2

Вы используете генерируемый ID для таблицы совещаний. и поскольку вы используете новые объекты без переопределения равных и hashcode, hibernate не может понять, что это единственный объект. Он будет вставлять несколько объектов, поскольку это два разных собрания с точки зрения БД (для каждого идентифицируется по отдельному идентификатору).

Возможно, если тема собрания является уникальным ограничением, измените свои определения, чтобы не иметь сгенерированное поле идентификатора, скорее сохраните столбец темы обсуждения как уникальный. Следовательно, удалите встречу с вашим компонентом и просто продолжайте тему. Затем вы можете использовать unique = true внутри аннотации @Column для темы.

Смежные вопросы