Hibernate的级联的事务问题
主表:School(id,s_name),子表Teacher(t_id,t_s_id,t_name)其中t_s_id为外键与School的id关联,关系cascade
config.xml:
<!--Transaction-->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<bean id="proxyTemplate" name="proxyTemplate"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,+Exception</prop>
<prop key="insert*">PROPAGATION_REQUIRED,+Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,+Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,+Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,+Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="service" parent="proxyTemplate">
<property name="target">
<ref local="hstudao" />
</property>
</bean>
<!--schooldao-->
<bean id="schooldao" class="com.ydx.stu.SchoolDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
stu.hbm.xml:
<hibernate-mapping package="com.ydx.stu" auto-import="true">
<class name="School" table="school" lazy="false">
<id name="id" type="int" column="id" length="4"></id>
<property name="s_name" type="string" column="s_name" length="45"></property>
<set name="teacher_set" inverse="true">
<key column="t_id"></key>
<one-to-many class="Teacher" />
</set>
<set name="student_set" inverse="true">
<key column="stu_s_id"></key>
<one-to-many class="Student" />
</set>
</class>
<class name="Teacher" table="teacher" lazy="false">
<id name="t_id" type="string" column="t_id" length="45"></id>
<property name="t_name" type="string" column="t_name" length="45"></property>
<many-to-one class="School" column="t_s_id" name="school" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
[code:]
dao.java: extends HibernateDaoSupport
public void insertTeacher(Teacher teacher) {
getHibernateTemplate().save(teacher);
}
test.java:
school = new School();
school.setId(11);
school.setS_name("ShenZhen11");
teacher1 = new Teacher();
teacher1.setSchool(school);
teacher1.setT_id("T1009");
teacher1.setT_name("Mr.hee");
dao_t.insertTeacher(teacher1);
疑问:当插入子表dao_t.insertTeacher(teacher1);如果teacher表t_id存在T1009,报重复主键异常,但是school表的记录(11,"ShenZhen11")已经插入成功;
这种情况该如何处理?是配置的问题还是代码问题?
[解决办法]
级联会有自动事务存在嘛?
如果不存在,当然会是你所说的那个结果啦!
[解决办法]
+Exception的问题
-前缀强制回滚,+前缀指定提交
你+的是Exception,意思应该是所有异常都不回滚,继续提交事务!
[解决办法]
hibernate默认是运行期异常才回滚事务的,你的应该是事务没有回滚,应该是配置的问题
[解决办法]
强烈同意三楼!!!
[解决办法]
这句话没起作用,你代码里根本没有annotation.
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="service" parent="proxyTemplate">
<property name="target">
<ref local="hstudao" />
</property>
这个给hstudao添加事务,和你帖出来dao.java有关系没?
这个+三楼给出了解释
<prop key="save*">PROPAGATION_REQUIRED,+Exception </prop>
把+Exception改成-Exception或删掉!因为Spring默认只回滚uncheck Exception,你的方法没有throws任何Exception,所以有异常的话只能是uncheck Exception
你的配制文件有点乱,而且命名也有些问题。
如果成功不了,把你的所有相关文件帖出来看看!
[解决办法]
那只能是你的配置文件写错了,好好检查下,没有所谓的第二类事务那么一说:
Rollback rules
The final facet of the transaction pentagon is a set of rules that define what exceptions
prompt a rollback and which ones do not. By default, transactions are rolled
back only on runtime exceptions and not on checked exceptions. (This behavior
is consistent with rollback behavior in EJBs.)
[解决办法]
学习了,spring事务日志的问题,配置很重要啊
[解决办法]
3楼正解.
[解决办法]
学习了
[解决办法]
[解决办法]
3楼正解-Exception。多看看AOP代理吧。
[解决办法]
[解决办法]
这个问题3楼说明白,但是你为什么切dao呢,这有什么意义么,如果建议你加一个service层,因为一个service可能会调用dao的好几个方法,如果切dao会产生多个session连接,也就是会多次连接数据库,切service会只有一个连接,会更好的