javax.persistence.TransactionRequiredException Jboss eap

时间:2016-10-12 16:45:42

标签: hibernate jpa jboss

我有一个实体类,如下所示:

@Entity
@Table(name = "MY_TABLE")
public class MyEntity implements Serializable {

    @Id
    @Column(name = "ID")
    @XmlAttribute
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "NAME")
    @XmlAttribute
    private String name;

    public String getId() {
        return id;
    }

    public void setId(final String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name= name;
    }
}

此实体由此类持久保存:

public class MyStarter {

    @PersistenceContext(unitName = "myUnit")
    private EntityManager manager;

    public void insertIntodb() {
        final MyEntity entity = new MyEntity();
        entity.setName("Sample");
        manager.persist(entity);
    }
}

但是,每当执行上面的持久代码时,我都会遇到异常:

javax.persistence.TransactionRequiredException: JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)

为了尝试解决这个问题,我在这里做了一些事情来验证哪些有效,哪些无效:

  • 我已验证用户与数据库的连接是否具有写入权限。

  • 我已经验证选择数据的本机查询确实可以从JPA执行并返回结果。

  • 我在@PersistanceContext注释中添加了type = javax.persistence.PersistenceContextType.EXTENDED

  • 我已更新persistance.xml文件以包含以下行:

    <jta-data-source>java:jboss/datasources/Mysource</jta-data-source>
    
    <properties>
        <property name="hibernate.dialect"  value="org.hibernate.dialect.SQLServerDialect" />
        <property name="hibernate.max_fetch_depth" value="3" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.id.new_generator_mappings" value="true" />
        <property name="hibernate.connection.isolation" value="2" />
        <property name="hibernate.default_schema" value="dbo" />
        <property name="hibernate.transaction.flush_before_completion"
            value="true" />
        <property name="hibernate.transaction.jta.platform"
            value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
    </properties>
    

然而,我仍然无法摆脱这个问题。我在这里找不到任何明显的东西?

1 个答案:

答案 0 :(得分:1)

使用@Transactional,如下所示

@Transactional
public class MyStarter {
...

或作为

@Transactional
public void insertIntodb() {
    final MyEntity entity = new MyEntity();
    entity.setName("Sample");
    manager.persist(entity);
}

这是因为persist()保证如果在事务边界之外调用它,执行INSERT/UPDATE语句。
因此,您需要一个事务来在db中保存对象,同时使用persist()

在Spring上下文文件中,您需要添加以下代码:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx.xsd">

<tx:annotation-driven />

您可以使用persist()代替save()save()方法可以在事务内部或外部执行。在使用扩展的会话/持久性上下文的长时间对话中,使用save() 良好。