java - Hibernate - 多对多 - 带有常量表

标签 java sql hibernate

我正在使用多对多关系的标准 Hibernate 方式。例如,参加 session 的员工如下:

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

和 session :

@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 对象。在这种情况下, session 表将保留两个不同的 session 行,例如:

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

由于我只有几个常量值作为 session 主题,我想防止重复,并且在执行相同的代码后出现这种情况:

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

我希望 Hibernate 认识到 session 表是一组常量,如果不需要,不要重复行。我尝试过使用独特的约束,但没有帮助。有办法实现这一点吗?

最佳答案

您正在使用 session table 生成的 ID。由于您使用新对象而不覆盖 equals 和 hashcode,hibernate 无法意识到这是单个对象。它将插入多个对象,因为从数据库的角度来看,这是两个不同的 session (每个 session 由单独的 ID 标识)。

也许,如果 session 主题是唯一约束,请将您的定义更改为不生成 ID 字段,而将 session 主题列保持为唯一。因此,从您的 bean 中删除 meetId 并仅保留主题。然后您可以在主题的 @Column 注释中使用 unique=true 。

关于java - Hibernate - 多对多 - 带有常量表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30372509/

相关文章:

c# - 通过数据网格将数据保存到数据库

php - 防止显示名称重复或重新输入名称

java - 如何使用 JPA 规范中的另一个公共(public)实体加入两个实体?

java - 如何在Android应用程序中实现FCM?我们是否可以使用 GCM 和 FCM 相同的监听器、接收器方法?

java - 将 NewDirectByteBuffer 从 C++ 传递到 Java (JNI)

java - Android Studio 拒绝运行 main()

mysql - 如何组合两个查询并将数据放入一行?

java - 从 Jtable 中选择一行并将该行数据获取到 Java 中的另一个表单窗口

mysql - Spring Boot+Hibernate向mysql插入空值

hibernate - JPA2 + Hibernate + Guice-persist : Version Behavior