Hibernate - 多对多 - 使用常量表

时间:2015-05-21 11:32:14

标签: java sql 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对象。在这种情况下,MEETING TABLE将保留两个不同的会议行,例如:

     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意识到Meeting表是一组常量,如果不是neccesarry则不重复行。我尝试过独特的约束,但没有帮助。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

您正在为会议桌使用生成的ID。既然你在使用新对象而不重写equals和hashcode,那么hibernate无法实现单个对象。它将插入多个对象,因为这些是从DB角度来看的两个不同的会议(由每个会议的单独ID标识)。

如果会议主题是唯一约束,则更改您的定义不要生成ID字段,而是将会议主题列保持为唯一。因此,从您的bean中删除meetingId并保持主题。然后你可以在@Column注释中使用unique = true作为主题。