【问题标题】:how to make two column as a primary key in hibernate annotation class如何在休眠注释类中将两列作为主键
【发布时间】:2014-02-12 14:01:40
【问题描述】:

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

这是我的代码..

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


}

【问题讨论】:

  • 我已经尝试过这些解决方案,但没有帮助。我什至在我的 hibernateUtil 类中映射了 user_groupId 类。但它显示此异常:“user_group_id 未映射 [select b.userId, a.trunkGroupName from com.avis.Hibernate.user_group a, user_group_id b where b.userId='4167758224@broadconnect.ca' and a.trunkGroupName =' BC51743/BC51743_TRK01']"。这就是问题
  • 这已经得到回答,但我发现这篇文章对类似的问题很有用:vladmihalcea.com/2016/08/01/…

标签: java hibernate composite-primary-key hibernate-annotations


【解决方案1】:

您应该创建一个包含 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 的 excellent answer 详细阐述了细节。您还可以查看 this 前段时间我针对几乎相同的问题发布的其他答案。

附带说明,如果您可以控制数据库结构,您还可以考虑避免使用复合键。 There are some reasons to do so.

【讨论】:

  • lopez 我已经尝试过这个解决方案,但它没有帮助。我和你上面说的一样。我什至在我的 hibernateUtil 类中映射了 user_groupId 类。但它显示此异常:“user_group_id 未映射 [select b.userId, a.trunkGroupName from com.avis.Hibernate.user_group a, user_group_id b where b.userId='4167758224@broadconnect.ca' and a.trunkGroupName =' BC51743/BC51743_TRK01']"。这就是问题
  • 根据您收到的错误,您似乎正在将user_groupId 类映射到数据库中的一个表。确保它没有@Entity,只有@Embeddable。为什么不首先发布您尝试过的东西,而不是玩所有这些猜谜游戏?
  • 2xavi 因为我想要不同的答案,如果我把我尝试过的东西放了,那么每个人都只建议我这个答案。我想要不同的方法来完成这项任务,这就是我放置基本代码的原因,但没关系我找到了答案......所以感谢您的帮助
  • @amitbhardwaj 很高兴您提出了解决方案。无论如何,和 AFAIK,除了建议的方法之外,没有其他方法可以将复合 id 与 JPA 映射。您介意在这里回答您自己的问题并接受它,以便该问题的未来访问者可能会发现它有帮助吗?如果您找到了没有接受的答案的问题,那么离开这个问题是没有意义的(如果您愿意,也可以删除该问题)。
  • 我使用了你上面建议的相同代码,但我添加了“@EmbeddedId@coloum(name = user_groupId) private user_groupId id;所以如果我触发查询,我可以使用 user_groupId 类的字段我的查询
【解决方案2】:

你可以在hibernate中使用@UniqueConstraint注解创建一个复合主键。

@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 类,它们可以作为系统上的实体使用。

【讨论】:

  • 我只是在寻找这种简单的技术。谢谢大佬!
  • 对于我和使用 SQL Server,这种方法会创建一个 UNIQUE 类型的 CONTRAINT,但不是包含两个字段的 PRIMARY KEY。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多