JPA持久事务回滚java.lang.NoClassDefFoundError
我正在尝试编写一个持久化实体的函数。这非常简单,但在持久化实体时抛出java.lang.NoClassDefFoundError。我不明白为什么 我一整天都在RTFME,为什么这么简单的代码不起作用,但只发现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
@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();
}