0

我尝试搜索,但在找到我想要的东西时遇到了问题。我有以下架构( * 表示主键)

USER
  *UserId
  -Desc
Registration
  *DeviceId
  *UserId
  -date

所以我想为注册创建一个主键,比如......

@Embeddable
public class RegPk{
    private String deviceId;
    private User user;
    @Column(name="DEV_ID")
    public String getDevId(){
      return deviceId;
    }
    ...
    @ManyToOne
    @JoinColumn(name="USER_ID", referencedColumnName="USER_ID")
    public User getUser() {
      return user;
    }
    ...
}

这是正确的吗?当我坚持时,它会在注册中正确更新 USER_ID 字段吗?

当我尝试这种事情时,我得到以下结果......

[10/7/13 13:37:07:156 EDT] 000000ae webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E:[Servlet 错误]-[Hello]:org.apache.openjpa.util.MetaDataException : 类型“class org.me.mfa.jpa.Registration”指定的id类与类的主键字段不匹配。确保您的身份类具有与持久类型相同的主键,包括 pk 字段类型。不匹配的属性:“用户”

所以现在怎么办?

4

2 回答 2

1

JPA 不允许主键类包含关系,只允许基本类型。JPA 2.0 允许关系与 ID 分开,但您可以将关系移至实体类,并让 RegPk 包含 deviceId 和 UserId。然后,设备-用户关系将被标记为 @Id 或 @MapsId("user") ,具体取决于您是要在实体中使用 @PKClass 还是 @EmbeddedId。有关使用 pk 类的示例,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers 。

在 JPA 1.0 中,您将使用类似的设置,但您的设备-用户关系将被标记为只读(通过指定 @PrimaryKeyJoinColumn 注释,或通过将 @JoinColumn 标记为 insertable=false、updatable=false)。然后,您需要手动设置主键基本映射值,直接从引用的用户实体中提取值。这当然要求 User 中的 id 已经分配,​​如果两个对象都是新的,这可能需要额外的工作。

于 2013-10-08T16:45:21.080 回答
0

我将添加cascade = CascadeType.ALL@ManyToOne注释以转发User实体的持久操作。

它看起来像:

    ...
    @ManyToOne(optional=true, cascade = CascadeType.ALL)
    @JoinColumn(name="USER_ID", referencedColumnName="USER_ID")
    public User getUser() {
      return user;
    }
    ...

好吧,如果没有其他错误,它可以工作。我对 id 有点困惑optional=true,因为它可以提供 id ,deviceId,null但这也可以。

于 2013-10-07T15:12:25.303 回答