我有一个完整的 Java EE Web 应用程序,带有表示层和数据库。我使用 derby 与 glassfish 3.1 和 JPA 来处理持久性。我已经创建了一个读取,但现在我在创建并保存到数据库时遇到了麻烦。我想我已经很接近了,但我尝试创作的方式有些不对劲。
这是我的 EAO 代码:
/**
* Session Bean implementation class XRSSeao
*/
@Stateless
@LocalBean
public class XRSSeao {
@PersistenceContext
EntityManager em;
public XRSSeao() {}
public void addEvent(String update){
Feed feed = new Feed();
feed.setStatus(update);
feed.setId(2);
em.getTransaction().begin();
em.persist(feed);
em.flush();
em.clear();
em.getTransaction().commit();
}
}
这将从另一个 EJB 调用。我也不想设置 ID,因为这是我希望在调用 persist 方法时生成的主键。我测试时得到的错误是:
“由以下原因引起:java.lang.IllegalStateException: 异常描述:使用 JTA 时无法使用 EntityTransaction。”
如果您不知道此代码有什么问题,但可以提供一个使用自动生成的主键进行简单持久化的示例,这将同样有帮助。
这是我正在运行的读取方法:
public String lastUpdate(){
String resultString;
Query q = em.createQuery("SELECT x FROM Feed x WHERE x.id = 1");
List<Feed> ListofStatus = q.getResultList(); //alternatively you can use getResultList() for non 1 object is expected.
Feed returnStatusObject = ListofStatus.get(0);
resultString = returnStatusObject.getStatus();
return resultString;
}
如果我不需要使用 Transaction(),我还没有在网上找到不使用它进行创建的示例。
最佳答案
您正在将 EJB/JTA 与 transaction-type="JTA"
一起使用。然后容器将自行管理事务。您可以通过@TransactionAttribute
控制交易和 @TransactionAttributeType
EJB 类/方法上的注释(默认情况下,但不是必需的)。您阅读的教程显然没有使用 EJB/JTA,而只是使用 transaction-type="RESOURCE_LOCAL"
应用程序管理事务。您应该阅读针对 EJB/JTA 使用的 JPA 教程。
要解决您的问题 - 我假设您想继续使用 EJB/JTA-,请替换
em.getTransaction().begin();
em.persist(feed);
em.flush();
em.clear();
em.getTransaction().commit();
由
em.persist(feed);
另请参阅:
关于java - 使用 JPA 和自动生成的主键标识将实体持久保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126129/