好吧,这可能是一个微不足道的问题,但我很难想象和理解它们的区别,以及何时使用它们。我还不太清楚像单向映射和双向映射这样的概念如何影响一对多/多对多关系。我现在使用的是Hibernate,所以任何与ORM相关的解释都是有帮助的。

作为一个例子,假设我有以下设置:

public class Person {
    private Long personId;
    private Set<Skill> skills;
    //Getters and setters
}

public class Skill {
    private Long skillId;
    private String skillName;
    //Getters and setters
}

在这种情况下,会有什么样的映射呢?希望您能回答这个特定的示例,但我还想了解一下什么时候使用一对多和多对多,什么时候使用连接表和连接列,什么时候使用单向和双向。


当前回答

一对多:一个人有很多技能,一个技能在人之间不会重复使用。

单向:一个人可以直接通过他的技能集引用技能 双向:每个“子”技能都有一个指向 Person(在代码中没有显示)

多对多:一个人拥有多个技能,一个技能在多个人之间重复使用。

单向:一个人可以直接通过他的技能集引用技能 双向:一项技能有一组与之相关的人。

在一对多关系中,一个对象是“父对象”,一个是“子对象”。父元素控制子元素的存在。在多对多中,任何一种类型的存在都依赖于它们之外的东西(在更大的应用程序上下文中)。

您的主题(领域)应该规定关系是一对多还是多对多——然而,我发现使关系单向还是双向是一种工程决策,需要权衡内存、处理、性能等。

令人困惑的是,多对多双向关系不需要是对称的!也就是说,一群人可以指向一项技能,但该技能不需要只与这些人相关。通常情况下是这样的,但这种对称性并不是必需的。以爱为例——它是双向的(“我爱”,“爱我”),但通常是不对称的(“我爱她,但她不爱我”)!

所有这些都得到Hibernate和JPA的良好支持。请记住,Hibernate或任何其他ORM在管理双向多对多关系时并不关心保持对称性……这完全取决于应用程序。

其他回答

1)圆圈代表实体/ pojo / bean

2) deg是degree在图中的缩写(边数)

PK=主键,FK=外键

注意度和边的名称之间的矛盾。Many对应degree=1, One对应degree >1。

一对多:一个人有很多技能,一个技能在人之间不会重复使用。

单向:一个人可以直接通过他的技能集引用技能 双向:每个“子”技能都有一个指向 Person(在代码中没有显示)

多对多:一个人拥有多个技能,一个技能在多个人之间重复使用。

单向:一个人可以直接通过他的技能集引用技能 双向:一项技能有一组与之相关的人。

在一对多关系中,一个对象是“父对象”,一个是“子对象”。父元素控制子元素的存在。在多对多中,任何一种类型的存在都依赖于它们之外的东西(在更大的应用程序上下文中)。

您的主题(领域)应该规定关系是一对多还是多对多——然而,我发现使关系单向还是双向是一种工程决策,需要权衡内存、处理、性能等。

令人困惑的是,多对多双向关系不需要是对称的!也就是说,一群人可以指向一项技能,但该技能不需要只与这些人相关。通常情况下是这样的,但这种对称性并不是必需的。以爱为例——它是双向的(“我爱”,“爱我”),但通常是不对称的(“我爱她,但她不爱我”)!

所有这些都得到Hibernate和JPA的良好支持。请记住,Hibernate或任何其他ORM在管理双向多对多关系时并不关心保持对称性……这完全取决于应用程序。

首先,阅读所有的小字。注意,NHibernate(因此,我认为Hibernate也是如此)关系映射与DB和对象图映射有一种有趣的对应关系。例如,一对一关系通常被实现为多对一关系。

其次,在我们告诉你应该如何写你的O/R图之前,我们也必须看到你的DB。特别是,一项技能可以被多人拥有吗?如果是这样,你有一个多对多关系;否则就是多对一。

第三,我不喜欢直接实现多对多关系,而是在您的域模型中对“连接表”建模。,将其视为一个实体,如下所示:

class PersonSkill 
{
    Person person;
    Skill skill;    
}

那你知道你有什么了吗?您有两个一对多的关系。(在本例中,Person可能有一个PersonSkills集合,但不会有一个Skills集合。)然而,有些人更喜欢使用多对多关系(人与技能之间);这是有争议的。

第四,如果你确实有双向关系(例如,不仅Person有一个技能集合,而且Skill也有一个Person集合),NHibernate不会在你的BL中强制执行双向关系;它只理解关系的双向性以实现持久性。

第五,在NHibernate(我假设是Hibernate)中,多对一比一对多(集合映射)更容易正确使用。

好运!

这可能需要如下所示的多对多关系



public class Person{

    private Long personId;
    @manytomany

    private Set skills;
    //Getters and setters
}

public class Skill{
    private Long skillId;
    private String skillName;
    @manyToMany(MappedBy="skills,targetClass="Person")
    private Set persons; // (people would not be a good convenion)
    //Getters and setters
}

你可能需要定义一个joinTable + JoinColumn,但它也可能没有…

我会这样解释:

有个关系

@OneToOne
Person person;

@OneToOne
Nose nose;

一对多-多对一的关系

@OneToMany
Shepherd shepherd;

@ManyToOne
List<Sheep> sheeps;

多对多-多对多关系

@ManyToMany
List<Traveler> travelers;

@ManyToMany
List<Destination> destinations;