2012-01-11 88 views
1

我試圖在Java EE中複製Facebook的牆。OneToMany JoinTable與非主鍵值

我有3個表格: 用戶,帖子,牆。

用戶有一個用戶名(PK)和其他字段,郵政有一個ID(PK),作者(用戶FK)和其他一些。 Wall是Post和User之間的連接表。

問題是,只有在Wall中,post和user都是PK,項目纔會編譯。 有帖子有PK和用戶只是非空值不會工作!

但是將它們都作爲PK導致@ManyToMany,這意味着相同的帖子可以在許多牆上,這是不正確的!

我試過有剛剛發佈的PK在長城和使用這個映射:

帖子:

@JoinTable(name = "Wall", joinColumns = { 
    @JoinColumn(name = "id", referencedColumnName = "id")}, inverseJoinColumns = { 
    @JoinColumn(name = "user", referencedColumnName = "username")}) 
@OneToMany 
private User user; 

用戶:

@ManyToOne 
private Collection<Post> onWall; 

但它說:

t上關係屬性[user]的目標實體他的班[class entity.Post]無法確定。當不使用泛型時,確保目標實體在關係映射上定義..

我的映射有什麼問題?

回答

1

如何兩個關係用戶到郵政,一個牆,一個用於作者:

  • 用戶一個一對多到(粘到用戶的塗鴉牆,無連接表),
  • 用戶一個一對多到(文章作者),

具有反向相對根據需要提供。

例如:

@Entity 
public class User { 
    @OneToMany(mappedBy="onWall") 
    private Collection<Post> wall; 

    // You can skip this relationship, if you don't want it 
    @OneToMany(mappedBy="author") 
    private Collection<Post> authoredPosts; 
} 

@Entity 
public class Post { 
    @ManyToOne 
    @JoinColumn(name="wallOwnerId") 
    private User onWall; 

    @ManyToOne 
    @JoinColumn(name="authorId") 
    private User author; 
} 
+0

我知道,但我認爲沃爾是不是正規的實體。我的意思是,Wall必須使用來自用戶的數據加入Post的數據,這就是爲什麼我認爲它是JoinTable的原因!沒有辦法做我在問題中提出的問題嗎?感謝您的答覆btw :) – StepTNT 2012-01-12 09:44:50

+0

@StepTNT編輯。 – MaDa 2012-01-12 10:06:24

+0

好點! :)另一個問題是......這不需要在Post表中有一個新字段來同時擁有作者和所有者? – StepTNT 2012-01-12 13:28:09