【问题标题】:How to use primary key of multiple tables as primary key of third table in hibernate如何在hibernate中使用多个表的主键作为第三个表的主键
【发布时间】:2021-01-12 17:34:58
【问题描述】:

我有两个表如下

张贴表

评论表

现在我想创建另一个名为 Activity 的表,该表将存储对帖子或评论执行的喜欢的聚合值。所以我想使用必须是帖子 id 或评论 id 的活动 id 字段和可以是帖子/评论(字符串)的类型字段。

我想为这两个字段创建复合主键。我应该如何在 Hibernate 中执行此操作?

【问题讨论】:

    标签: java sql spring hibernate


    【解决方案1】:

    您可以使用@IdClass 来创建包含这两个字段的复合键。首先,您需要定义一个包含复合键字段的新类:

    public class ActivityKey implements Serializable {
        protected Integer activity_id;
        protected String type;
    
        public ActivityKey () {}
    
        public ActivityKey (Integer activity_id, String type) {
            this.activity_id= activity_id;
            this.type= type;
        }
    }
    

    然后,您的 Activity 类必须如下所示:

    @Entity
    @IdClass(ActivityKey.class)
    class Activity {
        @Id
        private Integer activity_id;
        @Id
        private String type;
    
        //Other fields
    }
    

    在定义主键类(本例中为 ActivityKey)时有一些限制。此类必须是可序列化的,并且必须同时定义 hashCode() 和 equals() 方法。此外,它必须是公共的并且有一个公共的无参数构造函数。

    【讨论】:

      【解决方案2】:

      我不明白你对活动表的确切方法是什么,但是你可以在休眠中创建一个复合主键,假设你想组合employee_id 和dept_id 来形成一个主键。为此,我将使用 Lombok。我们需要创建一个单独的类,该类具有需要组合的属性,并且类必须实现 Serializable 并且必须覆盖 equals() 和 hashCode()。

      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      import javax.persistence.*;
      
      @Entity
      @Table(name = "EMPLOYEE_TBL")
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class Employee {
          @EmbeddedId
          private EmployeePKId employeePKId;
          private String name;
          private String email;
          private String phone;
      }
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.EqualsAndHashCode;
      import lombok.NoArgsConstructor;
      
      import javax.persistence.Embeddable;
      import java.io.Serializable;
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      @EqualsAndHashCode
      @Embeddable
      public class EmployeePKId implements Serializable {
          private int employeeId;
          private int deptId;
      }
      

      【讨论】:

        【解决方案3】:

        @Embeddable 公共类 BookId 实现 Serializable {

        private String author;
        private String name;
        
        // standard getters and setters
        

        }

        @实体 公共课本{

        @EmbeddedId
        private BookId id;
        private String genre;
        private Integer price;
        
        //standard getters and setters
        

        }

        上面的例子可能对你有帮助

        【讨论】:

          猜你喜欢
          • 2022-01-22
          • 2020-05-15
          • 1970-01-01
          • 2013-04-21
          • 1970-01-01
          • 1970-01-01
          • 2017-09-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多