Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我在JTA EJB的@PostConstruct方法中得到TransactionRequiredException?_Java_Jpa_Jakarta Ee_Jdbc_Glassfish 4 - Fatal编程技术网

Java 为什么我在JTA EJB的@PostConstruct方法中得到TransactionRequiredException?

Java 为什么我在JTA EJB的@PostConstruct方法中得到TransactionRequiredException?,java,jpa,jakarta-ee,jdbc,glassfish-4,Java,Jpa,Jakarta Ee,Jdbc,Glassfish 4,我有一个JavaEE项目,我想在@PostConstruct方法中使用注入的JTAEntityManagerEntityManager.persistent失败。当通过注入JSF托管bean的EJB实例调用时,它会成功。使用@Resource UserTransaction和UserTransaction.begin/commit或EntityManager.getTransaction.begin/commit手动启动事务,因为它是JTAEntityManager EJB接口 @Local p

我有一个JavaEE项目,我想在
@PostConstruct
方法中使用注入的JTA
EntityManager
<由于
javax.persistence.TransactionRequiredException,code>EntityManager.persistent
失败。当通过注入JSF托管bean的EJB实例调用时,它会成功。使用
@Resource UserTransaction
UserTransaction.begin/commit
EntityManager.getTransaction.begin/commit
手动启动事务,因为它是JTA
EntityManager

EJB接口

@Local
public interface UserService extends Serializable {

    public void saveUser(AUser user);
}

@Entity
public class AUser implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Long id;
    private String username;

    public AUser() {
    }

    public AUser(String username) {
        this.username = username;
    }

    public Long getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
EJB实现:

@Stateless
public class DefaultUserService implements UserService {
    private static final long serialVersionUID = 1L;
    @PersistenceContext
    private EntityManager entityManager;

    public DefaultUserService() {
    }

    @PostConstruct
    private void init() {
        AUser user = new AUser("initUser");
        saveUser(user);
    }

    @Override
    public void saveUser(AUser user) {
        entityManager.persist(user);
    }
}
persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="richtercloud_javaee-persist-in-postconstruct-jar_jar_1.0-SNAPSHOTPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/example1</jta-data-source>
    <class>richtercloud.javaee.persist.in.postconstruct.jar.entities.AUser</class>
    <properties>
      <property name="eclipselink.target-database" value="Derby"/>
      <!-- necessary in order to avoid syntax errors -->
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
      <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
      <property name="eclipselink.target-server" value="Glassfish"/>
      <!-- avoid non-severe NullPointerException being logged in GlasFish
            <ref>https://java.net/jira/browse/GLASSFISH-21468f</ref>-->
    </properties>
  </persistence-unit>
</persistence>

org.eclipse.persistence.jpa.PersistenceProvider
jdbc/示例1
richtercloud.javaee.persist.in.postconstruct.jar.entities.AUser
我不知道如何提供
jdbc/example1
数据源(它是GlassFish 4.1 jdbc资源,基于jdbc连接池,引用带有网络驱动程序的Derby数据库)。其他一切都可以在


我读到的内容超过了简单的
EntityManager.persist
调用
@PostConstruct
的例子,它指的是我没有使用的Spring。我没有发现关于
@PersistenceContext EntityManager
@PostConstruct

中表现不同的语句。这并不保证@PostConstruct和@PreDestroy是事务的一部分。因此,不应在施工后方法和施工前方法中进行DB操作

不保证@PostConstruct和@PreDestroy是交易的一部分。因此,不应在施工后方法和施工前方法中进行DB操作

EJB 3.2规范的§8.6.2规定:

术语“未指定的事务上下文”在EJB规范中用于表示EJB体系结构未完全定义企业bean方法执行的事务语义的情况。
这包括以下情况:

•使用容器管理的事务划分执行无状态会话bean的PostConstruct或PreDestroy回调方法


另一种解决方案可能是在persistence.xml文件中指定
javax.persistence.sql load script source
属性。它指向将预加载数据库的SQL脚本。这可以是嵌入到应用程序中的资源,也可以是文件URL。

EJB 3.2规范的§8.6.2规定:

术语“未指定的事务上下文”在EJB规范中用于表示EJB体系结构未完全定义企业bean方法执行的事务语义的情况。
这包括以下情况:

•使用容器管理的事务划分执行无状态会话bean的PostConstruct或PreDestroy回调方法

另一种解决方案可能是在persistence.xml文件中指定
javax.persistence.sql load script source
属性。它指向将预加载数据库的SQL脚本。这可以是嵌入在应用程序中的资源,也可以是文件URL