大家!
我一直试图找到答案,但我没有管理。
我尝试使用Enterprise Java Bean配置我的应用程序并使其在JBoss Application Server 7.1.1下运行。我的应用程序是Web应用程序,它使用servlet并将其他类作为EJB注入。问题是每个语句都被提交,这意味着不支持任何事务管理。
在我的测试示例中,我有一个带有子集合的实体(使用属性CascadeType.ALL与OneToMany关系映射)。如果集合中的记录存在某些问题(例如,不存在的外键),则无法将其插入表中并引发异常。但是,父实体会被插入,因此我假设插入是在不同的单独事务中完成的。这是严格意外行为,我试图解决它。
技术参数:
DBMS :Oracle EE 11g
AS :JBoss AS 7.1.1
我的 persistence.xml :
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
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/">
<persistence-unit name="OracleEntityManager">
<jta-data-source>java:jboss/CmaDevDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect" />
<property name="hibernate.hbm2ddl.auto" value="none" />
<property name="hibernate.jdbc.batch_size" value="20" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true" />
</properties>
</persistence-unit>
</persistence>
我的 EJB :
@Stateless(name="EntityWriter")
@TransactionManagement(TransactionManagementType.CONTAINER)
public class EntityWriter {
@Resource
private SessionContext context;
/*@Resource
UserTransaction ut;*/
@PersistenceContext(unitName = "OracleEntityManager",type=PersistenceContextType.EXTENDED)
EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public EntityMarker insertEntity(EntityMarker entity)throws Exception
{
try
{
entity = em.merge(entity);
em.flush();
return entity;
}
catch (Exception e)
{
context.setRollbackOnly();
e.printStackTrace();
return null;
}
}
}
实际上我尝试了两种EJB方法:容器管理事务和Bean管理事务,并且都不能像我期望的那样工作。
当我将bean注入servlet时,我这样做:
@EJB(name = "EntityWriter")
private EntityWriter entityWriter;
现在我认为bean很好,可能在persistence.xml中缺少。
会感激任何想法。提前谢谢!
答案 0 :(得分:7)
通过JBoss管理控制台编辑数据源配置并设置“使用JTA”复选框后,一切正常。默认情况下未经检查。
你是对的,克里斯。谢谢!