我在web应用程序中使用glassfish v2和持久性。
我使用Web应用程序中的普通java类文件调用持久性代码
我可以使用此代码轻松选择: -
@PersistenceUnit
public EntityManagerFactory emf;
EntityManager em;
public List fname (String id) {
String fname = null;
List persons = null;
//private PersistenceManagerFactory persistenceManagerFactory;
try {
emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");
em = emf.createEntityManager();
persons = em.createQuery("select r from Roleuser r").getResultList();
int i=0;
for (i=0;i<persons.size(); i++)
System.out.println("Testing n "+ i +" " + persons.get(i));
} catch(Exception e) {
System.out.println("" + e);
}
finally {
if(em != null) {
em.close();
}
}
return persons;
}
我想使用JTA作为persistence.xml文件进行更新 交易类型= “JTA”
当我尝试使用此代码进行更新时,我得到一个nullPointerException而日志中没有任何痕迹
@PersistenceUnit
public EntityManagerFactory emf;
EntityManager em;
Context context;
@Resource
private UserTransaction utx;
public List fname (String id) {
String fname = null;
List persons = null;
try {
emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");
utx.begin();
em = emf.createEntityManager();
int m = em.createQuery("update Roleuser r set r.firstName = 'Jignesh I' where r.userID=9").executeUpdate();
utx.commit();
} catch(Exception e) {
System.out.println("" + e);
}
finally {
if(em != null) {
em.close();
}
}
return persons;
}
任何帮助
由于
Pradyut
答案 0 :(得分:1)
<persistence-unit name="WebApplicationSecurityPU" transaction-type="RESOURCE_LOCAL">
代码
@PersistenceUnit
public EntityManagerFactory emf;
public EntityManager em;
public EntityManager getEm() {
emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");
em = emf.createEntityManager();
return em;
}
public List fname (String id) {
String fname = null;
List persons = null;
try {
System.out.println("test");
em = this.getEm();
em.getTransaction().begin();
int m = em.createQuery("update Roleuser r set r.firstName = 'Jignesh H' where r.userID=9").executeUpdate();
em.getTransaction().commit();
} catch(Exception e) {
System.out.println("" + e);
}
finally {
if(em != null) {
em.close();
}
}
return persons;
}
欢迎任何改进......(实际需要...) (如何使用@PersistenceContext)
由于
Pradyut
答案 1 :(得分:0)
createEntityManager()
- 使用@PersistenceContext
PersistenceUnit
,但随后重新分配etm
- 我建议删除两者并查看上面的p2。如果您根本没有使用任何依赖注入,请删除所有注释,保留当前代码并键入:
em.getTransaction().begin();
...
em.getTransaction().commit();
(并在persistence.xml中定义RESOURCE_LOCAL
。你真的不需要JTA)
答案 2 :(得分:0)
您的“普通”类很可能不是托管组件,即生命周期由容器管理的类(如Servlet,Servlet过滤器,JSP标记处理程序,JSF托管Bean,... 。)并且不能从资源注入 1 中受益。
因此UserTransaction
和EntityManagerFactory
都不会在这里注入,因此NullPointerException
。
老实说,您应该尝试使用托管EntityManager
的容器,这会使您的代码变得更加混乱。如果您无法注入,请通过JNDI查找获取它。请参阅下面的资源。
1 查看Web Tier to Go With Java EE 5: A Look at Resource Injection,了解可以注入的内容及其位置。