当前位置: 首页 > 面试题库 >

NHibernate双向多对多映射列表/包

轩辕源
2023-03-14
问题内容

我正在努力进行双向多对多映射,其中顺序在一侧很重要,而在另一侧则不重要。

我有两节课:程序和学生。

一个程序有很多学生,顺序很重要。

程序A

  1. 约翰
  2. 莎莉
  3. 赛斯

程式B

  1. 亚历克斯
  2. 赛斯
  3. 艾米
  4. 约翰

一个学生有很多程序,但是顺序在这里并不重要。

John 程序A 程序B

莎莉

  • 程序A

赛斯

  • 程序A
  • 程式B

亚历克斯

  • 程式B

艾米

  • 程式B

因此,似乎我可以在程序和学生之间建立双向的多对多关联,在这里我可以做这样的事情…

var john = GetJohn();
var programCount = john.Programs.Count; // 2

var programB = GetProgramB();
var studentCount = programB.Students.Count; // 4
var secondStudent = programB.Students[1]; // Seth

我不知道如何使映射工作。我不断收到PK违规错误。

我尝试了以下方法…

程序映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Program" table="Programs" lazy="false">
        <id name="ID" column="ID" type="Int32" unsaved-value="0">
            <generator class="identity" />
        </id>
        <property name="Title" column="Title" type="String" length="200" />
        <list name="Students" table="ProgramAssignments" lazy="true" cascade="all">
            <key column="ProgramID" />
            <index column="SequenceIndex" type="Int32" />
            <many-to-many column="StudentID" class="Student" />
        </list>
    </class>
</hibernate-mapping>

学生映射

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Student" table="Students" lazy="false">
        <id name="ID" column="ID" type="Int32" unsaved-value="0">
            <generator class="identity" />
        </id>
        <property name="Title" column="Title" type="String" length="200" />
        <bag name="Programs" table="ProgramAssignments" lazy="true">
            <key column="StudentID" />
            <many-to-many column="ProgramID" class="Program" />
        </bag>
    </class>
</hibernate-mapping>

我的关联表非常简单…

ProgramID int
StudentID int
SequenceIndex int

PK是ProgramID + StudentID。

我真的希望从程序方面进行管理,因为每个程序中学生的顺序很重要。但是,我真的很希望能够通过mystudent.Programs访问特定学生的程序。我尝试了多种映射方式,包括在程序列表中设置inverse
= true,尝试使用不同的级联选项等。似乎没有任何效果。

帮帮我!谢谢!


问题答案:

问题可能隐藏在以下事实中:<list>映射支持对一个实例的多次分配(因此,可能 会给 学生 Seth 分配两次,但具有不同的
SequenceIndex- 违反了PK错误)

但我想给你一个提示。尝试改变方法并引入中间对象。请参阅NHibernate文档:第24章。快速总结:

不要使用奇异的关联映射。

真正many-to- many关联的良好用例很少见。大多数时候,您需要存储在“链接表”中的其他信息。在这种情况下,最好将两个一对多关联用于中间链接类。实际上,我们认为大多数关联是一对多和多对一的,在使用任何其他关联样式时应格外小心,并问自己是否真的必要。

我想说的是(可能),因为您确实需要 订单



 类似资料:
  • 我的实体如下所示: 我的问题是: 为什么会这样,即使在我添加食谱和房子之间的联系之前没有发生? 我怎样才能修好它? 原因是什么?

  • 1. 前言 通过本节课程的学习,你将发现关联对象之间的微妙关系。相信这种关系对你更深入地认识 HIbernate 有很大的帮助。 通过本节课程,你将了解到: 多对多双向关联映射中哪一方是关系维系者; 级联操作与关系维系者。 2. 关系维系者 新学期开始了,同学们选择了各自喜欢的课程,现在为学生添加选修课程的任务就要落在 Hibernate 的身上。一起来看看 Hibernate 是如何完成这个任务

  • 1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有

  • 问题内容: 我正在寻找一种存储键值对的方法。我需要双向查询,但同时我需要为同一个键存储多个值。换句话说,类似于BidiMap,但是对于每个键,可以有多个值。例如,它需要能够保存以下对:“ s1”-> 1,“ s2”-> 1,“ s3”-> 2,并且我需要能够将值映射到每个键,并且对于每个值,获取与其关联的所有键。 问题答案: 因此,你需要多对多关系的支持吗?你可以得到的最接近的是Guava,Mul

  • 问题内容: 我的数据库包含3个表:User和Service实体具有多对多关系,并与SERVICE_USER表联接在一起,如下所示: 用户-SERVICE_USER-服务 SERVICE_USER表包含附加的BLOCKED列。 执行这种映射的最佳方法是什么?这些是我的实体类 我遵循以下示例http://giannigar.wordpress.com/2009/09/04/m … using-jpa

  • 问题内容: 映射双向列表时,我不了解Hibernate的行为。Hibernate生成的SQL语句对我来说并不是最佳的。有人可以启发我吗? 情况如下:我有一对多的父子关系。我将此关系与双向列表映射。 根据《Hibernate注释参考指南》(第7章:与索引集合的双向关联),映射应如下所示: 但是在这种情况下,Hibernate在保留一个孩子的父母时会产生三个SQL语句: 第三条语句似乎是多余的,因为并