【问题标题】:use objects as composite primary key in jpa在jpa中使用对象作为复合主键
【发布时间】:2016-09-01 09:54:31
【问题描述】:

您好,我想就JPA复合主键向您寻求帮助。 对于我的项目,我的 MySQL 数据库 中有不同的表用户、工作和参与。为此,我创建了用户、工作和参与类,在表参与中,我有一个复合主键,它引用用户主键和工作主键。 总结以下代码涉及类 ParticipationMyKeyParticipation

@Entity
@ManagedBean
@IdClass(value=MyParticipationKey.class)
public class Participation {
 @Id
 @Column(name="pkIduser")
 private User user;
 @Id
 @Column(name="pkIdet")
 private Work work;
 public User getUser() {
    return user;
 }
 public void setUser(User user) {
    this.user = user;
 }
 public Work getWork() {
    return work;
 }
 public void setWork(Work work) {
    this.work = work;
 }}

结束

public class MyParticipationKey implements Serializable {
/**
 * 
 */
 private static final long serialVersionUID = 1L;
 private User user;
 private Work work;
 public User getUser() {
    return user;
 }
 public void setUser(User user) {
    this.user = user;
 }
 public Work getWork() {
    return work;
 }
 public void setWork(Work work) {
    this.work = work;
 }   
}

以下几行涉及 User 和 Work 类

@Entity
@ManagedBean
public class User implements Serializable{
 @Id
 @GeneratedValue( strategy = GenerationType.IDENTITY )
 private Long pkIduser;
 @NotNull(message="Please enter your firstname")
 @Size(min=3,message="Min size 3 characters!")
 private String firstname;
 @NotNull(message="Please enter your lastname")
 @Size(min=3,message="Min size 3 characters!")
 private String lastname;
 @NotNull(message="Phone number field must not be null")
 @Size(min=5,message="Phone number must have !")
 private String phone;
 private String statut;
 @NotNull(message="Enter valid email")
 @Pattern(regexp="([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+    ([^.@]+)",message="please enter valid email")
 private String email;
 @NotNull(message="please enter password")
 @Size(min=3,message="Password must have 3 characters")
 private String password;
 public Long getPkIduser() {
    return pkIduser;
 }
 public void setPkIduser(Long pkIduser) {
    this.pkIduser = pkIduser;
 }
 public String getFirstname() {
    return firstname;
 }
 public void setFirstname(String firstname) {
    this.firstname = firstname;
 }
 public String getEmail() {
    return email;
 }
 public void setEmail(String email) {
    this.email = email;
 }
 public String getLastname() {
    return lastname;
 }
 public void setLastname(String lastname) {
    this.lastname = lastname;
 }
 public String getPhone() {
    return phone;
 }
 public void setPhone(String phone) {
    this.phone = phone;
 }
 public String getStatut() {
    return statut;
 }
 public void setStatut(String statut) {
    this.statut = statut;
 }
 public String getPassword() {
    return password;
 }
 public void setPassword(String password) {
    this.password = password;
 }


}

@Entity
@ManagedBean
public class Work implements Serializable{
/**
 * 
 */
 private static final long serialVersionUID = 1L;
 @Id
 @GeneratedValue( strategy = GenerationType.IDENTITY )
 private Long pkIdet;
 @NotNull(message="Enter the name")
 @Size(min=3,message="Name must have 3 characters!")
 private String name;
 private String type;
 private String description;
 private String statut;
 @ManyToOne
 @JoinColumn(name="pkIduser")
 private User user;

 public User getUser() {
    return user;
 }
 public void setUser(User user) {
    this.user = user;
 }
 public String getStatut() {
    return statut;
 }
 public void setStatut(String statut) {
    this.statut = statut;
 }
 public Long getPkIdet() {
    return pkIdet;
 }
 public void setPkIdet(Long pkIdet) {
    this.pkIdet = pkIdet;
 }
 public String getName() {
    return name;
 }
 public void setName(String name) {
    this.name = name;
 }
 public String getType() {
    return type;
 }
 public void setType(String type) {
    this.type = type;
 }
 public String getDescription() {
    return description;
 }
 public void setDescription(String description) {
    this.description = description;
 }
}

我不明白这里出了什么问题,因为我的 IDE Eclipse 对我说 来自嵌入式 ID 类 [class gct.entities.MyParticipationKey] 的映射 [work] 是此类的无效映射。与嵌入式 ID 规范(来自源 [class gct.entities.Participation] 的属性 [myParticipationKey])一起使用的可嵌入类只能包含基本映射。删除非基本映射或更改要嵌入的源上的嵌入 ID 规范。 请帮助我,欢迎提出任何建议。谢谢!

【问题讨论】:

  • 出了什么问题?查看一些文档datanucleus.org/products/accessplatform_5_0/jpa/orm/…
  • @NeilStockton 好吧,我去过,但我没有找到我想要的。我的问题涉及由关系 N-N 连接的两个表,它们生成一个名为“participation”的表。
  • 该页面告诉您如何将实体作为 PK 的一部分,既然您还没有说出您想要什么,那么任何人都可以提供帮助吗?!
  • 是的,我明白了,但在这里我想知道如何按对象保留复合主键?
  • 那么把第二个实体作为PK,并在PK类中表示它?与该页面告诉您的规则相同。您目前通过将 User 和 Work 放在 PK 类中做错了。阅读该页面,它会告诉您如何操作

标签: jpa composite-primary-key


【解决方案1】:

您的@IdClass 应包含与目标实体的@Id 字段匹配的字段。 MyParticipationKey 应该是这样的:

public class MyParticipationKey implements Serializable {
    private Long user;
    private Long work;
    ...
}

请注意,与普通的@IdClass 一样,字段名称必须与实体的相应字段名称匹配(在本例中为userwork);但字段的类型必须与目标实体的主键字段的类型匹配(在本例中为Long)。

派生的身份在 JPA 2.1 规范的 2.4.1 节中进行了讨论。

【讨论】:

  • 请问你能说清楚吗?
  • 如果您将UserWork 的代码(以及它们对应的@IdClasses,如有必要)添加到您的问题中,我也许可以为您提供可用的MyParticipationKey 代码。
  • 我已经编辑了我的答案,现在你应该可以使用它的MyParticipationKey
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
相关资源
最近更新 更多