Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在jpa中将对象用作复合主键_Jpa_Composite Primary Key - Fatal编程技术网

在jpa中将对象用作复合主键

在jpa中将对象用作复合主键,jpa,composite-primary-key,Jpa,Composite Primary Key,您好,我想请教您关于JPA复合主键的帮助。 对于我的项目,我在我的MySQL数据库中有不同的用户、工作和参与表。为此,我创建了类User、Work和Participation,正如在表Participation中一样,我有一个复合主键,它引用用户主键和Work主键。 总之,以下代码涉及班级参与和MyKeyParticipation @Entity @ManagedBean @IdClass(value=MyParticipationKey.class) public class Particip

您好,我想请教您关于JPA复合主键的帮助。 对于我的项目,我在我的MySQL数据库中有不同的用户、工作和参与表。为此,我创建了类User、Work和Participation,正如在表Participation中一样,我有一个复合主键,它引用用户主键和Work主键。 总之,以下代码涉及班级参与MyKeyParticipation

@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;
 }   
}
以下几行涉及类用户和工作

@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;
 }
}
我不明白这里出了什么问题,因为我的IDEEclipse告诉我 嵌入式ID类[class gct.entities.MyParticipationKey]的映射[work]对此类无效。与嵌入式ID规范(源[class gct.entities.Participation]的属性[myParticipationKey])一起使用的可嵌入类只能包含基本映射。删除非基本映射或更改要嵌入的源上的嵌入ID规范。
请帮助我,任何建议都欢迎。谢谢!

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

public class MyParticipationKey implements Serializable {
    private Long user;
    private Long work;
    ...
}
请注意,与普通的
@IdClass
一样,字段名必须与实体对应的字段名相匹配(在这种情况下,
user
work
);但是字段的类型必须与目标实体的主键字段的类型相匹配(
Long
,在本例中)


JPA 2.1规范第2.4.1节讨论了派生身份。

有什么问题?查看一些文档@NeilStockton好的,我已经访问过了,但是我没有找到我想要的。我的问题涉及由关系N-N连接的两个表,它们生成了一个名为“参与”的表。该页面告诉您如何将实体作为PK的一部分,既然您还没有说您想要什么,那么谁能帮助您?!是的,我理解,但这里我想知道如何通过对象持久化复合主键?因此,将第二个实体作为PK,并在PK类中表示它?该页面告诉您的规则与此相同。您当前将用户和工作放在PK类中是错误的。阅读该页面,它会告诉您如何操作。请您明确说明。如果您在问题中添加
用户
工作
(以及相应的
@IdClass
代码,如有必要),我可能可以给您提供可用的
MyParticipationKey
code。我已经编辑了我的答案,现在您应该可以使用它的
MyParticipationKey