GVKun编程网logo

Hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联

11

在本文中,您将会了解到关于Hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联的新资讯,并给出一些关于asp.

在本文中,您将会了解到关于Hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联的新资讯,并给出一些关于asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:、Hibernate Envers OneToMany Cascade.ALL org.hibernate.HibernateException:找到多个具有给定标识符的行、hibernate NonUniqueObjectException、Hibernate 框架:org.hibernate.exception.SQLGrammarException: Cannot open connection at org.hibernate...的实用技巧。

本文目录一览:

Hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联

Hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联

我有两个用户对象,而在尝试使用以下方法保存对象时

session.save(userObj);

我收到以下错误:

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]

我正在使用创建会话

BaseHibernateDAO dao = new BaseHibernateDAO();rtsession = dao.getSession(userData.getRegion(),                           BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);rttrans = rtsession.beginTransaction();rttrans.begin();rtsession.save(userObj1);rtsession.save(userObj2);rtsession.flush();rttrans.commit();rtsession.close(); // in finally block

我还尝试过session.clear()在保存之前进行操作,但仍然没有运气。

这是我第一次在用户请求到来时获取会话对象,因此我要为什么要说该对象存在于会话中。

有什么建议么?

答案1

小编典典

我已经多次发生此错误,很难追踪…

基本上,hibernate是指您有两个具有相同标识符(相同主键)但不是相同对象的对象。

我建议您分解代码,即注释掉位,直到错误消失,然后再放回代码,直到返回为止,您应该找到错误。

它通常是通过级联保存发生的,对象A和对象B之间有一个级联保存,但是对象B已经与该会话相关联,但是与对象A不在同一个实例B上。

您正在使用哪个主键生成器?

我问这个错误的原因与您如何告诉hibernate状态确定对象的持久状态(即对象是否持久)有关。该错误可能是由于hibernate试图持久化一个已经持久的对象而发生的。实际上,如果您使用保存,hibernate将尝试并持久化该对象,并且可能已经有一个对象具有与该会话关联的相同主键。

假设您有一个基于主键组合(表1和列2)的具有10行的表的hibernate类对象。现在,您已在某个时间从表中删除了5行。现在,如果您尝试再次添加相同的10行,而hibernate尝试将对象持久化到数据库中,则将添加5条已经删除的行而不会出现错误。现在,剩下的5行已经存在,将引发此异常。

因此,简单的方法是检查您是否已更新/删除了表中属于任何内容的任何值,以后又尝试再次插入相同的对象

asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:

asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:

当我在我的mvc应用程序中尝试并保存我的“公司”实体时,我收到以下错误

具有相同标识符值的不同对象已经与会话相关联:2,实体:

我正在使用IOC容器

private class EStoreDependencies : NinjectModule
    {
        public override void Load()
        {

            Bind<ICompanyRepository>().To<CompanyRepository>().Withconstructorargument("session",NHibernateHelper.OpenSession());
        }
    }

我的公司资料库

public class CompanyRepository : ICompanyRepository
{
    private ISession _session;

    public CompanyRepository(ISession session)
    {
        _session = session;
    }    

    public void Update(Company company)
    {

        using (ITransaction transaction = _session.BeginTransaction())
        {

            _session.Update(company);
            transaction.Commit();
        }
    }

}

和会话助手

public class NHibernateHelper
{
    private static ISessionFactory _sessionFactory; 
    const string SessionKey = "MySession";


    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                var configuration = new Configuration();
                configuration.Configure();
                configuration.AddAssembly(typeof(UserProfile).Assembly);
                configuration.SetProperty(NHibernate.Cfg.Environment.ConnectionStringName,System.Environment.MachineName);
                _sessionFactory = configuration.BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }

    public static ISession OpenSession()
    {
        var context = HttpContext.Current;
        //.GetCurrentSession()

        if (context != null && context.Items.Contains(SessionKey))
        {
            //Return already open ISession
            return (ISession)context.Items[SessionKey];
        }
        else
        {
            //Create new ISession and store in HttpContext
            var newSession = SessionFactory.OpenSession();
            if (context != null)
                context.Items[SessionKey] = newSession;

            return newSession;
        }
    }
}

我的MVC行动

[HttpPost]
    public ActionResult Edit(EStore.Domain.Model.Company company)
    {

            if (company.Id > 0)
            {

                _companyRepository.Update(company);
                _statusResponses.Add(StatusResponseHelper.Create(Constants
                    .RecordUpdated(),StatusResponseLookup.Success));
            }
            else
            {
                company.CreatedByUserId = currentUserId;
               _companyRepository.Add(company);
            }


        var viewmodel = Editviewmodel(company.Id,_statusResponses);
        return View("Edit",viewmodel);
    }

解决方法

我知道这有点迟了,你可能已经找到了解决方案,但也许其他人可以从中受益

当您更新保存在缓存中的实体的实例时,会从nHibernate引发此错误。基本上,nHibernate在加载缓存后将对象存储在缓存中,因此下一次调用将从缓存中获取。如果更新缓存上存在的实例nHibernate会抛出此错误,否则可能会在加载对象的旧副本时造成脏读和冲突。
要解决这个问题,您需要使用evict方法从缓存中删除对象,如:

public ActionResult Edit(EStore.Domain.Model.Company company) 
{ 

        if (company.Id > 0) 
        { 
            **ISession.evict(company);**
            _companyRepository.Update(company);

希望这可以帮助。

Hibernate Envers OneToMany Cascade.ALL org.hibernate.HibernateException:找到多个具有给定标识符的行

Hibernate Envers OneToMany Cascade.ALL org.hibernate.HibernateException:找到多个具有给定标识符的行

好的,问题是当你尝试

Car car = new Car();
car.setBrand("Alfa Romeo");
Set<Car> cars = new HashSet<>();
cars.add(car);

Driver driver = new Driver();
driver.setCars(cars);

em.persist(driver);

单向一对多,hibernate执行3条sql语句:

  1. 插入驱动程序 (id) 值 (?)
  2. 插入汽车(品牌,id)值(?,?)
  3. 更新汽车设置 driver_id=?其中 id=?

切换到双向关系

@Entity
@Audited
public class Car {

    @Id
    @GeneratedValue
    private Long id;

    private String brand;

    @ManyToOne
    private Driver driver;

    // Constructor,getters and setters omitted
}

@Entity
@Audited
public class Driver {

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(cascade = CascadeType.ALL,mappedBy = "driver")
    @AuditJoinTable(name = "car_aud")
    private Set<Car> cars = new HashSet();

    public void setCars(Set<Car> cars) {
        books.forEach(b -> b.setDriver(this));
        this.cars.addAll(cars);
    }

    // Constructor,getters and setters omitted

}

使 Hibernate 只创建 2 个 SQL 语句:

  1. 插入驱动程序 (id) 值 (?)
  2. 插入汽车 (driver_id,brand,id) 值 (?,?,?)

结果相同。所以CAR_AUD表中不会有歧义。

hibernate NonUniqueObjectException

hibernate NonUniqueObjectException

今天同事在使用hibernate时出现的异常,org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session;

查看了他的代码发现,持久化对象自增列ID没有标注为只增。

Hibernate 框架:org.hibernate.exception.SQLGrammarException: Cannot open connection   at org.hibernate...

Hibernate 框架:org.hibernate.exception.SQLGrammarException: Cannot open connection at org.hibernate...

报错信息

org.hibernate.exception.SQLGrammarException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java92

报错原因

在数据库中没有对应的配置文件的数据库名称

解决方法

创建或者修改正确的数据库名称即可

报错信息

Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
 1 java.lang.ExceptionInInitializerError
 2     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 3     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
 4     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 5     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
 6     at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
 7     at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
 8     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 9     at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
10     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
11     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
12     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
13     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
14     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
15     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
16     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
17     at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
18     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
19     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
20     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
21     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
22     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
23     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
24 Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
25     at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:110)
26     at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:135)
27     at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80)
28     at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:323)
29     at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:475)
30     at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:133)
31     at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
32     at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:297)
33     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
34     at com.mikey.util.HibernateUtil.<clinit>(HibernateUtil.java:11)
35     ... 22 more
36 Caused by: java.lang.reflect.InvocationTargetException
37     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
38     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
39     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
40     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
41     at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:107)
42     ... 31 more
43 Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for students in class com.mikey.bean.Classs
44     at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:328)
45     at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:321)
46     at org.hibernate.mapping.Property.getGetter(Property.java:304)
47     at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:299)
48     at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:158)
49     at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:77)
50     ... 36 more
errorMessage

报错原因

在映射文件和持久化类的配置不正确,请检查修改配置参数 

解决方法

检查持久化类的映射文件配置参数

 

今天关于Hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联的分享就到这里,希望大家有所收获,若想了解更多关于asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:、Hibernate Envers OneToMany Cascade.ALL org.hibernate.HibernateException:找到多个具有给定标识符的行、hibernate NonUniqueObjectException、Hibernate 框架:org.hibernate.exception.SQLGrammarException: Cannot open connection at org.hibernate...等相关知识,可以在本站进行查询。

本文标签: