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
JPA持久事务回滚java.lang.NoClassDefFoundError_Java_Jpa_Rollback_Jta_Transactional - Fatal编程技术网

JPA持久事务回滚java.lang.NoClassDefFoundError

JPA持久事务回滚java.lang.NoClassDefFoundError,java,jpa,rollback,jta,transactional,Java,Jpa,Rollback,Jta,Transactional,我正在尝试编写一个持久化实体的函数。这非常简单,但在持久化实体时抛出java.lang.NoClassDefFoundError。我不明白为什么 我一整天都在RTFME,为什么这么简单的代码不起作用,但只发现java.lang.NoClassDefFoundError 职能: @Transactional(Transactional.TxType.REQUIRED) public void commitTest1() { try { Replaces replaceEnt

我正在尝试编写一个持久化实体的函数。这非常简单,但在持久化实体时抛出java.lang.NoClassDefFoundError。我不明白为什么

我一整天都在RTFME,为什么这么简单的代码不起作用,但只发现java.lang.NoClassDefFoundError

职能:

@Transactional(Transactional.TxType.REQUIRED)
public void commitTest1() {
    try {
        Replaces replaceEntry=new Replaces(6077, new Date(), "username");
        replaceEntry.setAddId(1);
        entityManager.persist(replaceEntry);
    } catch (Throwable ex) {
        ex.printStackTrace();
    } finally {

    }
}
实体类:

@Entity
@Table(name = "replaces")
@XmlRootElement
public class Replaces implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Basic(optional = false)
    @NotNull
    @Column(name = "date")
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "user")
    private String user;

    @Basic(optional = false)
    @Column(name = "computer_id")
    private Integer computerId;

    @Basic(optional = true)
    @Column(name = "remove_id")
    private Integer removeId;

    @Basic(optional = true)
    @Column(name = "add_id")
    private Integer addId;
//getters, setters
}
和persistence.xml:

<persistence-unit name="Sandbox-ejbPU" transaction-type="JTA">
    <jta-data-source>jdbc/testdb</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
</persistence-unit>
解决了。我找到了该做的事。我使用以下代码连接到构造函数中的DB:

//Any transaction will be rolled back in this case
EntityManagerFactory emf = Persistence.createEntityManagerFactory("IRM2EE-ejbPU");    
entityManager = emf.createEntityManager();
我创建了无状态bean

@Stateless
@LocalBean
public class ConnectorDB {
    @PersistenceContext(unitName = "Sandbox-ejbPU", type=PersistenceContextType.TRANSACTION)
    private EntityManager entityManager;

    public EntityManager getEntityManager() {
        return entityManager;
    }

    //Voodoo code, the program doesn't work without that
    //You will get Unable to retrieve EntityManagerFactory for unitName "Sandbox-ejbPU"
    @PostConstruct
    private void postConstructChores() {
        Replaces replaceEntry=entityManager.find(Replaces.class, 9138);
    }
}
我将其添加到托管bean中:

@EJB
private ConnectorDB connectorDB;

@PostConstruct
private void postConstructChores() {
    entityManager=connectorDB.getEntityManager();
}

是否用@Entity注释Replaces.class?

是否可以添加完整的堆栈跟踪?找不到哪个类?stracktrace太小,无法找出您的问题所在。在我看来,这似乎是部署问题。类路径一定有问题。应用程序是如何打包的?lib目录中有什么?classes目录中有什么,persistence.xml在哪里?该应用程序就像普通企业应用程序一样打包在EAR文件中的NetBASN中。库中只有mysql JDBC驱动程序。它是由NetBeans创建的锅炉板代码。我更新了我的问题。
@EJB
private ConnectorDB connectorDB;

@PostConstruct
private void postConstructChores() {
    entityManager=connectorDB.getEntityManager();
}