2011-03-18 226 views
0

我有兩個實體,其中一個(Task)自己兩個引用另一個實體(用戶)。映射一個實體有兩個引用另一個實體

public class Task{ 
    private int id; 

    private User publisher; 

    private List<User> manager; 
} 

public User{ 
    private int id; 
    private String name; 
    private List<Task> tasks; 
} 

在任務方面,我可以設置「一比一」到「發行人」,和「一到多」到「經理」,但是如何設置映射在用戶側?

回答

3

這取決於你想要在數據庫中擁有什麼。

如果你想有一個單獨的外鍵爲publisher,並加入表manager,最簡單的方式給對方映射它這樣的:

public class Task{ 
    @ManyToOne 
    private User publisher; 

    @ManyToMany 
    private List<User> manager; 

    ... 
} 

public User{ 
    @OneToMany(mappedBy = "publisher") 
    private List<Task> publishedTasks; 

    @ManyToMany(mappedBy = "manager") 
    private List<Task> managedTasks; 

    ... 
} 

如果actaully需要的任務在User一個列表,你可以通過編程來創建它。

或者,你可以有一個單獨的連接表有附加屬性Role

public enum Role { PUBLISHER, MANAGER } 

public class Task{ 
    @ManyToMany 
    @MapKeyEnumerated 
    private Map<Role, User> participants; 
    ... 
} 

public User{ 
    @ManyToMany(mappedBy = "participants") 
    private List<Task> tasks; 
    ... 
} 

也認爲是否需要這種關係是雙向的。當您需要特定用戶參與的所有任務列表時,看起來沒有太多用例。也許你根本不需要User方面的這種關係,而是可以使用查詢。

+0

非常感謝!我從來沒有想過在用戶中可以有兩個List ,謝謝。:)我會試一試! :) – hguser 2011-03-18 11:39:51