编程语言
首页 > 编程语言> > Java-JPA-级联关系保持一对一关系

Java-JPA-级联关系保持一对一关系

作者:互联网

我有一个双向的一对一关系,我也希望其中一个实体的ID也是另一个实体的ID.

我的代码是这样的:

@Entity
public class UserProfile extends AbstractEntity{
     @OneToOne(mappedBy="user",cascade = CascadeType.ALL)
     private UserPreferences preferences;

     //...
}

另一个实体:

@Entity
public class UserPreferences implements Serializable{
  @Id
  @Column(name="USER_ID")
  private String userId;  // I want USER_ID act as both primary key and foreign key

  @OneToOne
  @PrimaryKeyJoinColumn(name="USER_ID")
  UserProfile user;

  // ...
}

但是当我坚持这样的UserProfile时:

UserPreferences pref = new UserPereferences();
pref.setUser(user);
user.setPreferences(pref);
em.persist(user);

它给我一个错误,该错误表明UserPreferences的ID不能为null
似乎jpa无法理解它应该使用UserProfile ID作为UserPreferences ID.

错误:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'USER_ID' cannot be null
Error Code: 1048
Call: INSERT INTO USERPREFERENCES (USER_ID) VALUES (?)

我的代码有什么问题吗? jpa可以解决这个问题吗?还是我应该分开坚持?

提前致谢

解决方法:

你不这样做

@Id
@Column(name="USER_ID")
private String userId;  // I want USER_ID act as both primary key and foreign key

@OneToOne
@PrimaryKeyJoinColumn(name="USER_ID")
UserProfile user;

因为您使用了两次参考,所以只需使用一次

@OneToOne
@Id
@Column(name="USER_ID")
UserProfile user;

像这样

标签:one-to-one,jpa,primary-key,cascade,java
来源: https://codeday.me/bug/20191119/2038019.html