2013-03-06 99 views
0

我想對我的系統中的某位用戶進行評論,此評論是由其他用戶製作的。因此,這裏是我的用戶的表:JPA中的多個可寫映射?

user table

這是我user_review表:

user review table

的EclipseLink的是產生這樣的(實際上它insted的的​​是@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" 

我真的不做些什麼,因爲我已經嘗試了很多事情,不同的協會,但似乎沒有奏效。有任何想法嗎 ?

+0

你使用Eclipse? – 2013-03-06 11:02:26

+0

你有沒有解決這個問題? – 2013-03-15 15:57:58

回答

1

嗯 - 你的總結:在JPA

多可寫的映射?

不匹配似乎是你的問題:

爲什麼會出現這樣的錯誤:加入欄「user_ID的」不能對錶「user_review」解決了嗎?

因此,我猜你在user字段上指定@JoinColumn時遇到「多次寫入...」問題;當您在user字段中指定@PrimaryKeyJoinColumn時,會得到「...無法解決...」問題。

@PrimaryKeyJoinColumn不能在@ManyToOne映射來使用。 (當實體共享主鍵時,它可以在@OneToOne映射中使用。)因此,Eclipse正在計算由JPA規範(即"user_id")定義的默認連接列名稱,並且由於該列不在user_review表上,因此您會收到一條錯誤消息,指出無法在數據庫上解析該字段表。

你應該在你的user場取消註釋@JoinColumn。這導致了兩個@OneToMany映射,這些映射將確定要寫入數據庫的id_user列的外鍵 - 它將採用由user字段引用的User或由userInfo字段引用的UserInfo的主鍵值。這是不允許的。要麼你需要重新修改你的數據庫關係或對象模型或標記映射只讀(@JoinColumn(name="id_user", insertable = false, updatable = false))之一。

+0

謝謝它的工作原理布​​賴恩 – 2013-03-24 12:21:27

-1

它看起來像代碼和您發佈的錯誤消息之間不匹配。 錯誤消息抱怨代碼中名爲'user_id'的列,但是@JoinColumn註釋使用'id_user'。

這看起來不正確,那也許是因爲你在一個點上覆制的異常,然後改變了代碼?

+0

這可能是多倫,但我幾乎可以肯定的是我正確複製的一切。但是很快我就接近代碼,我會研究它。 – 2013-03-06 17:00:06

0

這將是最奇怪的事情..但我只是刪除行:

// @JoinColumn(name="id_user") 

,且Eclipse不報警了約。(迄今=]) 我將離開這個主題開放'因爲我真的認爲這很奇怪發生和解決這個問題。

UPDATE

我一樣布賴恩指示,它似乎解決我的問題:

@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