在本文中,您将会了解到关于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:具有相同标识符值的另一个对象已与会话关联
- 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:具有相同标识符值的另一个对象已与会话关联
我有两个用户对象,而在尝试使用以下方法保存对象时
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,实体:
具有相同标识符值的不同对象已经与会话相关联: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:找到多个具有给定标识符的行
好的,问题是当你尝试
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语句:
- 插入驱动程序 (id) 值 (?)
- 插入汽车(品牌,id)值(?,?)
- 更新汽车设置 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 语句:
- 插入驱动程序 (id) 值 (?)
- 插入汽车 (driver_id,brand,id) 值 (?,?,?)
结果相同。所以CAR_AUD表中不会有歧义。
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...
报错信息
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
报错原因
在映射文件和持久化类的配置不正确,请检查修改配置参数
解决方法
检查持久化类的映射文件配置参数
今天关于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...等相关知识,可以在本站进行查询。
本文标签: