Hibernate Jboss与事务
我有一个具有两个字符串字段的实体:ID和NAME,NAME具有nullable=false 对于jboss和hibernate,我试图插入三条记录,其中一条记录是错误的,因为字段名=null。我将事务级别设置为REQUIRES_NEW,因此我希望数据库中有两条记录,回滚中只有一条记录,但所有记录都被回滚 我的错误在哪里 持久性文件:Hibernate Jboss与事务,hibernate,jboss,transactions,jta,Hibernate,Jboss,Transactions,Jta,我有一个具有两个字符串字段的实体:ID和NAME,NAME具有nullable=false 对于jboss和hibernate,我试图插入三条记录,其中一条记录是错误的,因为字段名=null。我将事务级别设置为REQUIRES_NEW,因此我希望数据库中有两条记录,回滚中只有一条记录,但所有记录都被回滚 我的错误在哪里 持久性文件: <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="persistenceUnit" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/myDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
</properties>
</persistence-unit>
</persistence>
EJB文件:
@Stateless
public class MyEJB {
protected EntityManager em;
@PersistenceContext(unitName = "persistenceUnit")
public void setEm(EntityManager em) {
this.em = em;
}
@Transactional(Transactional.TxType.REQUIRES_NEW)
private void insert(String id, String name) {
em.merge(new MyEntity(id, name));
}
public void insertTwoRecords() {
insert("id1", "name1");
insert("id2", null);// error field in entity is nullable = false
insert("id3", "name3");
}
}
事务是基于代理的。当组件MyEJB被注入到组件调用程序中时,实际注入的是一个代理,它委托给MyEJB。在调用MyEJB之前,此代理将检查事务注释,并在必要时启动事务:
Caller ---> proxy ----> MyEJB
在这种情况下,MyEJB直接调用另一个自身的私有方法。不仅私有方法不是组件的公共接口的一部分,而且方法调用也不是从一个组件到另一个组件的,因此代理无法拦截调用并启动新事务。什么示例?只要将insert方法放在另一个无状态bean中,注入MyEJB,它就会按预期工作。
Caller ---> proxy ----> MyEJB