我有一个带有表示层和数据库的完整Java EE Web应用程序。我正在使用带有glassfish 3.1和JPA的derby来处理持久性。我已经创建了一个Read ok但是现在我正在做一个创建并持久保存到数据库的麻烦。我觉得我很接近,但是我想要创造的方式不对。
这是我的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(),我没有找到一个不用于创建的在线示例。
答案 0 :(得分:1)
您正在使用带有transaction-type="JTA"
的EJB / JTA。然后容器将管理事务本身。您可以通过EJB类/方法上的@TransactionAttribute
和@TransactionAttributeType
注释来控制事务(默认情况下不应该这样)。您阅读的教程显然没有使用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);