nHibernate分享参考?

时间:2008-12-12 14:16:12

标签: nhibernate hibernate exception

保存对象时出现以下异常:

  

找到对集合的共享引用

有谁知道这意味着什么?

4 个答案:

答案 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)

quick google says

  rel   Group n --- 1 User
         m             ^
         |             | inh
         |  rel        |
         --------- n Member
  

rel代表关系(关联)   inh代表继承

     

成员之后抛出异常   已成功创建对象   然后从中读过   数据库。在最后一个Member对象之后   被读取事务已提交   但这失败了。

你的映射是什么样的?

答案 2 :(得分: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属性非常重要。在连接子类映射中,您应该只映射您要映射的层次结构中的级别唯一的属性:

  1. 对于Being,您只能映射DnaSequence属性。
  2. 对于Animal,您只能映射Relatives属性。
  3. 对于Human,您只能映射Name属性。
  4. 如果您偶然在Relatives映射中映射Human,NHibernate将抛出“找到对集合的共享引用”。

答案 3 :(得分:0)

您是否在其他地方引用了该集合中的任何对象?另一个会话,可能,甚至在另一个对象的同一会话中?确保在访问hibernate时,您在任何休眠会话中控制对这些对象的唯一引用。

免费获取贴纸的机会↓↓↓
豫ICP备18024241号-1