我必须要实体:
public class User
{
public virtual long Id { get; set; }
public virtual long Name { get; set; }
}
public class Group
{
public virtual long Id { get; set; }
public virtual long Name { get; set; }
}
映射如下:
public class UserMapping : ClassMapping<User>
{
public UserMapping()
{
Table("User");
Id(e => e.Id, t => t.Generator(new IdentityGeneratorDef()));
Property(e => e.Name, map => map.Length(50));
}
}
public class GroupMapping : ClassMapping<Group>
{
public GroupMapping()
{
Table("Group");
Id(e => e.Id, t => t.Generator(new IdentityGeneratorDef()));
Property(e => e.Name, map => map.Length(50));
Set(x => x.Users, set =>
{
set.Table("UserToGroup");
set.Key(key => key.Column("GroupId");
},
re => re.ManyToMany(m => m.Column("UserId")));
}
}
当我删除用户条目时,应从表UserToGroup中删除所有提及此用户的条目。当我删除组条目时,应从表UserToGroup中删除所有提及该组的条目;
我究竟需要如何重写我的映射?
答案 0 :(得分:0)
这是双向关联的 noniverse 方面的NH的标准行为。非反面(没有set.Inverse(true))可用于持久更改连接表。要从反面删除对象,您需要编写其他代码。
要从多对多关联中删除实体很容易,只需调用session.Delete(实体)和NH将从连接表中删除实体和所有相关记录。要从反面删除实体(使用Inverse(true)映射的实体),您需要采用另一种方式
var user = ... // user do delete
// delete records from join table
foreach (var group in user.Groups)
{
group.Users.Remove(user);
}
// delete entity
session.Delete(user);
我在Hibernate论坛中看到的类似代码是对同一问题的回答。