我正在使用NHibernate&在我的项目中使用C#和MySql db的Net Persistence API,我有UI层(ASP.NET),业务层和数据访问层(DAL)。我在DAL的UserManager类中有以下Save方法:
private EntityManager GetEm()
{
if (_entityManager == null)
{
_entityManagerFactory = Persistence.CreateEntityManagerFactory("JPUMain");
_entityManager = _entityManagerFactory.CreateEntityManager();
}
return _entityManager;
}
public void Save(IGenericEntity entity)
{
_entityManager = GetEm();
_entityManager.GetTransaction().Begin();
_entityManager.Persist(entity);
_entityManager.Flush();
_entityManager.GetTransaction().Commit();
_entityManager.Clear();
}
我的用户实体:
[Entity]
[Table(Name = "user")]
public class User : IGenericEntity
{
[Id]
[GeneratedValue]
public virtual int ID { get; set; }
[Basic]
[Column(Name = "name", Nullable = false)]
public virtual string Name { get; set; }
[ManyToOne(Fetch = FetchType.EAGER, TargetEntity = typeof(Tag), Cascade = new[] { CascadeType.ALL })]
[JoinColumn(Name = "tag_id")]
public virtual Tag Tag { get; set; }
}
标记实体:
public class Tag : IGenericEntity
{
[Id]
[GeneratedValue]
public virtual int ID { get; set; }
[Basic]
[Column(Name = "name", Nullable = false)]
public virtual string Name { get; set; }
[Temporal(TemporalType.TIMESTAMP)]
[Column(Name = "created_on", Nullable = false)]
public virtual DateTime CreatedOn { get; set; }
}
我在我的业务逻辑中的一个方法中执行以下操作:
public void DoOperation()
{
var tags = FindAllTags() // Get list of all tag entities.
for(var tag in tags)
{
var user = new User{
Name = "XYZ",
Tag = tag
};
}
UserManager.Save(user); // Save method just calls the save method of entity manager.
}
现在我在UserManager.Save(user);
行中遇到以下错误Exception in saving questionNPersistence.PersistenceException: a different object with the same identifier value was already associated with the session: 1, of entity: JDAL.Impl.Entities.Tag ---> NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 1, of entity: JDAL.Impl.Entities.Tag
at NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformUpdate(SaveOrUpdateEvent event, Object entity, IEntityPersister persister)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsDetached(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj)
据我检查过这个问题,我想我在1个会话中检索标签,然后尝试将其保存在与User的另一个会话中(因为Tag已映射到用户,因此在保存用户时它也将尝试更新标签)。但我不知道如何使用.NET JPA在1个会话中执行此操作?
有人可以解决这个问题吗?
修改
此问题仅发生在生产中。我无法在使用Visual Studio 2010调试代码的开发环境中重现此问题。