如何在hibernate注释类中将两列作为主键

这是我的注释类,我希望userIdgroupId列都作为主键。 我发现了更多关于此的问题( 问题 ),但未找到相关答案。 我的声誉较少,所以我无法评论post,所以我在这里提出我的问题。

这是我的代码..

 import javax.persistence.Column; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.NaturalId; @Entity @Table(name="user_group") public class user_group { @Column(name="serviceProvider") private String serviceProvider; @Column(name="enterpriseId") private String enterpriseId; @Column(name="department") private String department; @Column(name="trunkGroupName") private String trunkGroupName; @Id @Column(name="userId") private String userId; @Column(name="groupId") private String group; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getGroup() { return group; } public void setGroup(String group) { this.group = group; } public String getServiceProvider() { return serviceProvider; } public void setServiceProvider(String serviceProvider) { this.serviceProvider = serviceProvider; } public String getEnterpriseId() { return enterpriseId; } public void setEnterpriseId(String enterpriseId) { this.enterpriseId = enterpriseId; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } public String getTrunkGroupName() { return trunkGroupName; } public void setTrunkGroupName(String trunkGroupName) { this.trunkGroupName = trunkGroupName; } } 

您应该创建一个包含PK字段的新@Embeddable类:

 @Embeddable public class user_groupId implements Serializable { @Column(name="userId") private String userId; @Column(name="groupId") private String group; } 

并在@Entity中将其用作@EmbeddedId

 @Entity public class user_group { @EmbeddedId user_groupId id; ... } 

您也可以使用@IdClass注释来实现该效果。

Pascal Thivent的这个出色的答案详细阐述了这一点。 您还可以看一下我前面发布的几乎相同的问题的其他答案。

另外,如果您可以控制数据库结构,也可以考虑避免使用复合键。 有一些理由这样做 。

您可以使用@UniqueConstraint批注在hibernate中创建复合主键。

 @Table(name="user_group",uniqueConstraints=@UniqueConstraint(columnNames= {"userId","groupId"})) public class user_group { @Column(name="userId") private String userId; @Column(name="groupId") private String group; } 

如果我们使用spring,上面的方法是不可行的,因为创建复合主键我们必须创建一个类并不是一件好事。
在hibernate和spring中,您只需要创建POJO类,它们可以作为系统中的实体使用。