每个用户都有一个角色列表:
<class name="User" lazy="false" table="Users">
<id name="Id" type="int">
<generator class="native"/>
</id>
<property name="Name" />
<bag name="RoleList" table="User_Role" inverse="true" lazy="false" collection-type="Roles">
<key column="UserId" foreign-key="Id"/>
<many-to-many class="Role" column="RoleId"/>
</bag>
</class>
我正在跟踪SQL服务器的所有查询。当我选择用户时,我也看到了SQL SELECT语句(这是Ok)。问题是当我尝试更新现有用户(具有角色)时:我只看到User
表的更新,而不是User_Role
的更新(这是不好的) )。
澄清:我不希望在Role
表中插入/更新(但在User_Role
中,因为角色是“永久的”,可以自由附加和分离。
为什么选择正常,但更新。请?如果需要更多信息 - 请问 - 我会尝试回答所有次要问题。
更新: Role
映射:
<class name="Role" lazy="false" table="Roles">
<id name="Id" type="int">
<generator class="native"/>
</id>
<property name="Name" />
<property name="Description" />
</class>
更新N2:这就是表格的定义方式:
Role
表:
CREATE TABLE [Roles] (
[Id] INTEGER NOT NULL PRIMARY KEY,
[Name] text NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0)
);
CREATE UNIQUE INDEX uidxUserName ON Roles (Name COLLATE NOCASE);
User
表:
CREATE TABLE [Users] (
[Id] INTEGER NOT NULL PRIMARY KEY,
[Name] text NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0)
);
CREATE UNIQUE INDEX uidxRoleName ON Users (Name COLLATE NOCASE);
User_Role
relatioin table(外键):
CREATE TABLE [User_Role] (
[UserId] INTEGER NOT NULL,
[RoleId] INTEGER NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0),
PRIMARY KEY (UserId, RoleId),
FOREIGN KEY (UserId) REFERENCES Users(Id),
FOREIGN KEY (RoleId) REFERENCES Roles(Id)
);
答案 0 :(得分:1)
我自己遇到了类似的问题。
尝试删除User集合和Role集合上的inverse="true"
,看看是否有任何区别。这对我有用。
对于多对多关系和inverse
属性,似乎存在一些意外行为。也许其他人可以解释为什么这比我发生得更好。 :)
更新:如果我没有弄错,你需要在角色映射下映射多对多包。 尽量保留inverse="false"
或完全没有inverse
属性。
您确定那里使用的foreign-key
值吗?
另外,我认为在映射class
属性时,您需要提供完全限定的名称,即:Namespace.Class, Assembly
。
除此之外,它看起来大多像我自己的映射文件。
答案 1 :(得分:0)
<bag name="RoleList" table="User_Role" cascade="save-update">
<key column="UserId"/>
<many-to-many class="Role" column="RoleId"/>
</bag>
另外:lazy="false"
几乎总是一个坏主意。