JPA中的多个可写映射?

时间:2013-03-06 10:58:28

标签: hibernate jpa eclipselink pojo

我想对我系统中的某些用户进行审核,此评论由其他用户制作。所以这是我的用户表:

user table

这是我的user_review表:

user review table

EclipseLink正在生成这样的内容(实际上@PrimaryJoinColumn @JoinColumn的内容因post而改变了 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Temporal(TemporalType.DATE) private Date date; private String review; //bi-directional many-to-one association to User // @PrimaryKeyJoinColumn(name="id_user_reviewer") @ManyToOne @JoinColumn(name="id_user_reviewer") private User reviewer; //bi-directional many-to-one association to User // @JoinColumn(name="id_user") @ManyToOne @PrimaryKeyJoinColumn(name="id_user") private User user; //bi-directional many-to-one association to UserInfo @ManyToOne @JoinColumn(name="id_user") private UserInfo userInfo; }:

Join column "user_id" cannot be resolved on table "user_review"

并一直给我这个错误:

{{1}}

我真的不该做什么'因为我已经尝试了很多东西,不同的联想,但似乎没有任何工作。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

嗯 - 你的总结:

JPA中的多个可写映射?

与您的问题似乎不匹配:

为什么会出现此错误:无法在表“user_review”上解析加入列“user_id”?

因此,当您在@JoinColumn字段中指定user时,我猜您会遇到“多个可写...”问题;如果在@PrimaryKeyJoinColumn字段中指定user,则会出现“...无法解决...”问题。

@PrimaryKeyJoinColumn无法用于@ManyToOne映射。 (当实体共享主键时,它可用于@OneToOne映射。)因此,Eclipse正在计算JPA规范("user_id")定义的默认连接列名称,并且由于该列不在您的user_review表中,因此会收到一条错误消息,指出无法在数据库表上解析该字段。

您应取消评论@JoinColumn字段中的user。这导致两个@OneToMany映射将确定要写入数据库上id_user列的外键 - 它将采用由User引用的主键的值。 user字段或UserInfo字段引用的userInfo字段。这是不允许的。您需要重新编写数据库关系或对象模型,或者将其中一个映射标记为只读(@JoinColumn(name="id_user", insertable = false, updatable = false))。

答案 1 :(得分:0)

这将是最奇怪的事情..但我只是删除该行:

//  @JoinColumn(name="id_user")

Eclipse不再警告..(到目前为止=)) 我将保持这个线程开放'因为我真的认为这是非常奇怪的发生并且这样解决。

<强>更新

我按照Brian的指示做了,似乎解决了我的问题:

@Entity
@Table(name="user_review")
public class UserReview implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;

    @Temporal(TemporalType.DATE)
    private Date date;

    private String review;

    //bi-directional many-to-one association to User
    @ManyToOne
    @JoinColumn(name="id_user_reviewer", insertable=false, updatable=false)
    private User user1;

    //bi-directional many-to-one association to User
    @ManyToOne
    @JoinColumn(name="id_user")
    private User user2;

    //bi-directional many-to-one association to UserInfo
    @ManyToOne
    @JoinColumn(name="id_user", insertable=false, updatable=false)
    private UserInfo userInfo;
        .. more code

答案 2 :(得分:-1)

看起来代码与您发布的错误消息之间存在不匹配。 错误消息是在您的代码中抱怨名为“user_id”的列,但@JoinColumn注释使用“id_user”。

这似乎不对,可能是您在某一点复制了异常然后更改了代码?