站在持久化的角度。Hibernate把对象分为4中状态。 临时状态。 持久化状态。游离状态。删除状态。
1:Save()方法:
//这个是验证:1:save方法使临时对象------>变成持久化对象。
2:为对象分配ID。
3:flush缓存时发送insert语句。
@org.junit.Test ???public void testSave(){ ???????News news=new News(); ???????news.setTitle("AA"); ???????news.setAuthor("aa"); ???????news.setDate(new Date(0)); ???????System.out.println("save保存前打印:"+news); ???????session.save(news); ???????System.out.println("save保存后打印:"+news); ???}
//这个是验证:ID在save方法前保存无效。
1 @org.junit.Test 2 ????public void testSave(){ 3 ????????News news=new News(); 4 ????????news.setTitle("BB"); 5 ????????news.setAuthor("bb"); 6 ????????news.setDate(new Date(0)); 7 ????????news.setId(100); 8 ????????System.out.println("save保存前打印:"+news); 9 ????????session.save(news);10 ????????System.out.println("save保存后打印:"+news);11 ????}
//这是验证 持久化对象的ID不能进行修改。
1 @org.junit.Test 2 ????public void testSave(){ 3 ????????News news=new News(); 4 ????????news.setTitle("BB"); 5 ????????news.setAuthor("bb"); 6 ????????news.setDate(new Date(0)); 7 ????????System.out.println("save保存前打印:"+news); 8 ????????session.save(news); 9 ????????news.setId(4);10 ????????System.out.println("save保存后打印:"+news);11 ????}
org.hibernate.exception.ConstraintViolationException: could not execute statement
ConstraintViolationException ??违反唯一约束条件
constraint 英 [k?n?stre?nt] ?n. ?约束; 限制; 强制
violation 英 [?va??‘le??n] ???n. ?违反,妨碍,侵犯; 违犯,违背; [体] 违例,犯规; 强奸,亵渎,污辱 ???at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74) ???at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) ???at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) ???at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) ???at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136) ???at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96) ???at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58) ???at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2975) ???at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3480) ???at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) ???at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) ???at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:214) ???at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:194) ???at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:178) ???at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321) ???at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286) ???at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192) ???at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125) ???at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206) ???at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) ???at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191) ???at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) ???at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) ???at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764) ???at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756) ???at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752) ???at com.hibernate.helloworld.Test.testSave(Test.java:54) ???at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ???at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ???at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ???at java.lang.reflect.Method.invoke(Method.java:597) ???at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) ???at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) ???at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) ???at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) ???at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) ???at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) ???at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) ???at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) ???at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) ???at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) ???at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) ???at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) ???at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) ???at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) ???at org.junit.runners.ParentRunner.run(ParentRunner.java:236) ???at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) ???at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry ‘BB‘ for key ‘UK_duq2gjdo5k53otrakypw0888b‘ ???at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ???at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) ???at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) ???at java.lang.reflect.Constructor.newInstance(Constructor.java:513) ???at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) ???at com.mysql.jdbc.Util.getInstance(Util.java:381) ???at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) ???at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) ???at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515) ???at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447) ???at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951) ???at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101) ???at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554) ???at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761) ???at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2046) ???at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964) ???at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949) ???at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ???... 47 moreorg.hibernate.AssertionFailure: null id in com.hibernate.helloworld.News entry (don‘t flush the Session after an exception occurs) ???at org.hibernate.event.internal.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:79) ???at org.hibernate.event.internal.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:194) ???at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:156) ???at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:228) ???at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:100) ???at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) ???at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) ???at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) ???at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) ???at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) ???at com.hibernate.helloworld.Test.destroy(Test.java:34) ???at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ???at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ???at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ???at java.lang.reflect.Method.invoke(Method.java:597) ???at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) ???at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) ???at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) ???at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:37) ???at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) ???at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) ???at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) ???at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) ???at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) ???at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) ???at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) ???at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) ???at org.junit.runners.ParentRunner.run(ParentRunner.java:236) ???at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) ???at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
2:persist():和save一样。只有一个区别:
在persist()方法前设置ID会报错。如果对象有ID。不能执行insert。而是会抛出异常
@org.junit.Test ???public void testPersist(){ ???????News news=new News(); ???????news.setTitle("CC"); ???????news.setAuthor("cc"); ???????news.setDate(new Date(0)); ???????news.setId(4); ???????System.out.println("save保存前打印:"+news); ???????session.persist(news); ???????System.out.println("save保存后打印:"+news); ???}
org.hibernate.PersistentObjectException: detached entity passed to persist: com.hibernate.helloworld.News
persistent ?英 [p??s?st?nt] ??adj. ?持续的; 持久的; 坚持不懈的; 坚持不渝
???? detached 英 [d??t?t?t] ?adj. ?超然的; 分离的,分开的; 公平的; 分遣的,派遣的
v. 派遣; 分开(detach的过去式和过去分词); 分离,退出
persist ?v. ?坚持; 存留; 固执; 继续存在 ???at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141) ???at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) ???at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:853) ???at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:827) ???at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:831) ???at com.hibernate.helloworld.Test.testPersist(Test.java:55) ???at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ???at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ???at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ???at java.lang.reflect.Method.invoke(Method.java:597) ???at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) ???at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) ???at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) ???at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) ???at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) ???at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) ???at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) ???at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) ???at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) ???at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) ???at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) ???at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) ???at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) ???at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) ???at org.junit.runners.ParentRunner.run(ParentRunner.java:236) ???at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) ???at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) ???at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Hibernate ?Session 4种对象状态
原文地址:http://www.cnblogs.com/bulrush/p/7786973.html