2012-01-05 72 views
2

使用JoinTable

我試圖做使用Java2EE類似Twitter的項目,這裏的數據庫的簡單示意圖。
提及,追隨者和以下是三個JoinTable。 (需要注意的是提到,跟隨,跟隨一位用戶領域有User.username爲外鍵。) 我有與第一個問題,導致我的部署失敗與此異常:

異常說明:映射在元素[字段提及]上的引用列名稱[用戶名]不對應映射引用上的有效字段。

下面是兩個實體的映射。

鳴叫:

public class Tweet implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    ... 

    @JoinColumn(name = "user", referencedColumnName = "username") 
    @ManyToOne 
    User user; 
    @JoinTable(name = "Mention", joinColumns = { 
     @JoinColumn(name = "tweet", referencedColumnName = "id")}, inverseJoinColumns = { 
     @JoinColumn(name = "mentioned", referencedColumnName = "username")}) 
    @OneToMany 
    private Collection<Tweet> mentions; 

用戶:

public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 50) 
    @Column(name = "username", nullable = false, length = 50) 

    ... 

    @OneToMany(mappedBy = "user") 
    Collection<Tweet> tweets; 
    @JoinTable(name = "Following", joinColumns = { 
     @JoinColumn(name = "user", referencedColumnName = "username")}, inverseJoinColumns = { 
     @JoinColumn(name = "following", referencedColumnName = "username")}) 
    @OneToMany 
    Collection<User> following; 
    @JoinTable(name = "Followers", joinColumns = { 
     @JoinColumn(name = "user", referencedColumnName = "username")}, inverseJoinColumns = { 
     @JoinColumn(name = "follower", referencedColumnName = "username")}) 
    @OneToMany 
    Collection<User> followers; 
    @OneToMany(mappedBy = "mentions") 
    Collection<Tweet> mentioning; 

這有什麼錯我的映射? 有人可以指點我的解決方案嗎?

+0

這將是很好的,你或許刪除無關的映射註解,我覺得大部分代碼是風馬牛不相及的問題和解決的壓痕等:-) – 2012-01-05 15:12:56

+0

固定。我在User類中留下了一些映射,因爲它們可能也是錯誤的:) – StepTNT 2012-01-05 15:21:25

+0

'Mention. mentioned'應該被'User.username'引用。 '以下'沒有'用戶名'字段,但是它與這個映射一起工作,''Mention'完全相同 – StepTNT 2012-01-05 16:03:05

回答

0

我認爲你必須改變

@JoinColumn(name = "mentioned", referencedColumnName = "username") 

指定用戶表

@JoinColumn(name = "mentioned", referencedColumnName = "user") 

由於基本消息說你tweet表沒有一個外鍵字段username它不像你所說的那樣user

這個 - >private Collection<Tweet> mentions;也應該是一對多的col用戶的經文讓你有

@OneToMany 
@JoinTable(
    name = "Mention", 
    joinColumns = { 
     @JoinColumn(name = "tweet", referencedColumnName = "id") 
    }, 
    inverseJoinColumns = { 
     @JoinColumn(name = "mentioned", referencedColumnName = "user") 
    } 
)  
private Collection<User> mentions; 
+0

已經嘗試過'referencedColumnName =「user」'但是錯誤是一樣的! 我不明白,第一個選項,你說 – StepTNT 2012-01-05 16:14:17

+0

使用第二個導致相同的錯誤面前:/ 有了第一個,現在我已經得到了這個消息:'異常說明:不兼容的映射已經遇到之間[class entity.User]和[class entity.Tweet]。這通常發生在一個映射的基數不隨其backpointer'的基數 – StepTNT 2012-01-05 16:40:09

+0

忽略我提到,錯了,第一種方式相對應,你試圖改變這兩個'referenceColumnName'和'收集'用戶 – 2012-01-05 16:47:30