【问题标题】:mapping a entity which have two refer to another same entity映射具有两个引用另一个相同实体的实体
【发布时间】:2011-07-18 01:42:15
【问题描述】:

我有两个实体,其中一个(任务)拥有两个引用另一个实体(用户)。

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;
}

在Task端,我可以将“一对一”设置为“发布者”,将“一对多”设置为“管理员”,但是在用户端如何设置映射呢?

【问题讨论】:

    标签: hibernate mapping entity


    【解决方案1】:

    这取决于你想在数据库中拥有什么。

    如果您想为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;
    
         ...
    }
    

    如果您实际上需要 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 端根本不需要这种关系,可以使用查询来代替。

    【讨论】:

    • 非常感谢!!!没想到用户里面可以有两个List,谢谢。:)我试试!! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多