Hibernate多对多映射在插入时无法正常工作

时间:2011-09-03 18:22:00

标签: c# .net sql nhibernate

我继承了一个Spring + NHibernate c#app,我们正在对它进行重大改革(我对NHibernate相当新)。在数据库中设置的用户/角色不是最优的,因此我正在重写它,因为项目的一部分无论如何都在添加新功能。但是,转换为NHibernate无法正常工作。以下是我的设置的相关部分:

数据库: 3张桌子; USERS,ROLES和USERS_XREF_ROLES(这是连接/桥接表)

User.hbm.xml:

<set name="Roles" table="[USERS_XREF_ROLES]" lazy="false" order-by="[FK_ROLES] asc" cascade="all">
    <key column="[FK_USERS]" />
    <many-to-many class="UserRole" column="[FK_ROLES]" />
</set>

UserRole.hbm.xml:

<set name="Users" inverse="true" table="[USERS_XREF_ROLES]" lazy="false" >
    <key column="[FK_ROLES]" />
    <many-to-many class="User" column="[FK_USERS]" />
</set>

另请注意,UserRole类中最初没有设置“Users”;我添加了它,因为添加了桥接/连接表和SO上的另一个帖子,提到了使用反向集来建立桥接/连接表。所有SELECT都运行良好。我经历了多个用户并测试了他们应该拥有的权限。但是,当我尝试创建一个新用户时,它显然也试图插入到ROLES中:

错误:Hibernate操作:无法插入:[UserRole] [SQL:INSERT INTO [ROLES]([VALUE])VALUES(?);选择SCOPE_IDENTITY()]; SQL的未分类DataException [INSERT INTO [ROLES]([VALUE])VALUES(?);选择SCOPE_IDENTITY()];错误代码 [];无法将值NULL插入列'NAME',表'ROLES';列不允许空值。 INSERT失败。该语句已终止。

新用户显然应该向USERS和USERS_XREF_ROLES生成一个INSERT,但不是ROLES。那么,我在这里做错了什么?感谢。

更新:我正在努力让我的问题更加清晰。我的大问题是,我发现的所有示例都显示将相关对象的两个插入到每个相应的表中并进入连接表。我希望能够添加具有现有角色的用户。创建用户时,我不希望在ROLES表中出现插入。创建用户应始终将一条记录插入USERS,将一条或多条记录插入USERS_XREF_ROLES,但绝不插入ROLES,因为用户将始终被分配到现有角色。我希望这更清楚。我还没有找到一个显示这个的例子,这一定是很常见的事情。

1 个答案:

答案 0 :(得分:0)

  

新用户显然应该向USERS和USERS_XREF_ROLES生成一个INSERT,但不是ROLES。那么,我在这里做错了什么?感谢。

这句话让我感到困惑,我可能只是误解,但如果USERS_XREF_ROLES是一个桥接表,那么为什么INSERT进入USERS需要插入桥接表?用户可能存在而没有分配任何角色,不是吗?考虑到这一点,我希望问题不在于nHibernate映射,而在于你的c#对象被实例化的方式。也许正在使用User类的实例化创建一个未绑定的Role类?