保存对象时出现以下异常:
找到对集合的共享引用
有谁知道这意味着什么?
答案 0 :(得分:4)
理论上,这意味着您有2条记录,其中包含对另一个对象的相同引用。在数据库级别,这很可能是一个弱实体,但在代码级别,这很可能表示为集合。
您是否复制了其他记录集? E.g。
Blog blog1 = Blog.Find(1);
Blog blog2 = new Blog();
blog2.Entries = blog1.Entries;
blog2.Save();
此代码适用于ActiveRecords,但由于它建立在nHibernate之上,因此基本原理是相同的。
当我遇到这个问题时,有趣的是它所提到的集合是不正确的。这是一个不同的。
如果这是您的问题,请尝试迭代每个项目并将其分配给新集合。 E.g。
Blog blog1 = Blog.Find(1);
Blog blog2 = new Blog();
foreach (BlogEntry entry in blog1.Entries)
blog2.Entries.Add(entry);
blog2.Save();
答案 1 :(得分:3)
rel Group n --- 1 User
m ^
| | inh
| rel |
--------- n Member
rel代表关系(关联) inh代表继承
成员之后抛出异常 已成功创建对象 然后从中读过 数据库。在最后一个Member对象之后 被读取事务已提交 但这失败了。
你的映射是什么样的?
答案 2 :(得分:0)
您是否在其他地方引用了该集合中的任何对象?另一个会话,可能,甚至在另一个对象的同一会话中?确保在访问hibernate时,您在任何休眠会话中控制对这些对象的唯一引用。
答案 3 :(得分:0)
根据我的经验,当您有一个连接子类映射时,会发生此错误,其中继承的属性在超类和子类中都被映射。假设你有这些对象:
public class Being
{
public string DnaSequence { get; protected set; }
}
public class Animal : Being
{
public IList<Animal> Relatives { get; protected set; }
}
public class Human : Animal
{
public string Name { get; protected set; }
}
在Human
映射中,不映射Relatives
属性非常重要。在连接子类映射中,您应该只映射您要映射的层次结构中的级别唯一的属性:
Being
,您只能映射DnaSequence
属性。Animal
,您只能映射Relatives
属性。Human
,您只能映射Name
属性。如果您偶然在Relatives
映射中映射Human
,NHibernate将抛出“找到对集合的共享引用”。