Hibernate Jboss与事务

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:

我有一个具有两个字符串字段的实体:ID和NAME,NAME具有nullable=false

对于jboss和hibernate,我试图插入三条记录,其中一条记录是错误的,因为字段名=null。我将事务级别设置为REQUIRES_NEW,因此我希望数据库中有两条记录,回滚中只有一条记录,但所有记录都被回滚

我的错误在哪里

持久性文件:

<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