我有这种方法:
mymethod(long id){ Person p = DAO.findPerson(id); Car car = new Car(); car.setPerson(p); p.getCars().add(car); DAO.saveOrUpdate(car); DAO.saveOrUpdate(p); DAO.delete(p.getCars().get(0));//A person have many cars }
映射:
Person.hbm.xml
<!-- one-to-many : [1,1]-> [0,n] --> <set name="car" table="cars" lazy="true" inverse="true"> <key column="id_doc" /> <one-to-many class="Car" /> </set> <many-to-one name="officialCar" class="Car" column="officialcar_id" lazy="false"/>
Cars.hbm.xml
<many-to-one name="person" class="Person" column="id_person" not-null="true" lazy="false"/>
此方法适用于单个线程,并且在多个线程上,给我一个错误:
02/08/2014 - 5:19:11 p.m. - [pool-1-thread-35] - WARN - org.hibernate.util.JDBCExceptionReporter - SQL Error: 60, SQLState: 61000 02/08/2014 - 5:19:11 p.m. - [pool-1-thread-35] - ERROR - org.hibernate.util.JDBCExceptionReporter - ORA-00060: deadlock detection while waiting for a resource 02/08/2014 - 5:19:11 p.m. - [pool-1-thread-35] - WARN - org.hibernate.util.JDBCExceptionReporter - SQL Error: 60, SQLState: 61000 02/08/2014 - 5:19:11 p.m. - [pool-1-thread-35] - ERROR - org.hibernate.util.JDBCExceptionReporter - ORA-00060: deadlock detection while waiting for a resource 02/08/2014 - 5:19:11 p.m. - [pool-1-thread-35] - ERROR - org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update
AOP交易:
<tx:advice id="txAdviceNomService" transaction-manager="txManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="getAll*" read-only="true" propagation="SUPPORTS" /> <tx:method name="find*" read-only="true" propagation="SUPPORTS" /> </tx:attributes> </tx:advice>
注意:当我在更新后添加Thread.sleep(5000)时,就可以了。 但是这种解决方案并不干净。
我有汽车->(1-n)个地方。而且我在表位置(id_car)有一个外键。此外键没有索引。当我向该外键添加索引时,我的问题已解决。