我正在使用多对多关系的标准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则不重复行。我尝试过独特的约束,但没有帮助。有没有办法实现这个目标?
答案 0 :(得分:2)
您正在为会议桌使用生成的ID。既然你在使用新对象而不重写equals和hashcode,那么hibernate无法实现单个对象。它将插入多个对象,因为这些是从DB角度来看的两个不同的会议(由每个会议的单独ID标识)。
如果会议主题是唯一约束,则更改您的定义不要生成ID字段,而是将会议主题列保持为唯一。因此,从您的bean中删除meetingId并保持主题。然后你可以在@Column注释中使用unique = true作为主题。