【发布时间】:2021-01-12 17:34:58
【问题描述】:
我有两个表如下
张贴表
评论表
现在我想创建另一个名为 Activity 的表,该表将存储对帖子或评论执行的喜欢的聚合值。所以我想使用必须是帖子 id 或评论 id 的活动 id 字段和可以是帖子/评论(字符串)的类型字段。
我想为这两个字段创建复合主键。我应该如何在 Hibernate 中执行此操作?
【问题讨论】:
我有两个表如下
张贴表
评论表
现在我想创建另一个名为 Activity 的表,该表将存储对帖子或评论执行的喜欢的聚合值。所以我想使用必须是帖子 id 或评论 id 的活动 id 字段和可以是帖子/评论(字符串)的类型字段。
我想为这两个字段创建复合主键。我应该如何在 Hibernate 中执行此操作?
【问题讨论】:
您可以使用@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() 方法。此外,它必须是公共的并且有一个公共的无参数构造函数。
【讨论】:
我不明白你对活动表的确切方法是什么,但是你可以在休眠中创建一个复合主键,假设你想组合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;
}
【讨论】:
@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
}
上面的例子可能对你有帮助
【讨论】: