2012-07-31 77 views
1

如果您在行使CRUD方法做你必须做这个(交易类型:RESOURCE_LOCAL没有JTA)你每次访问你的数据库时都需要创建EntityManager()吗?

@PersistenceUnit(unitName="mongo") 
EntityManagerFactory emf; 

EntityManager em; 


@Inject 
private SomeObj injectableObj; 

public void create() 
{ 
    em = emf.createEntityManager(); <---- here 
    SomeObj obj = new SomeObj(); 
    em.persist(obj); 
} 

public void read() 
{ 
    em = emf.createEntityManager(); <---- here 
    Query query = em.createQuery("Select s from SomeObj s"); 

} 

public void update() 
{ 
    em = emf.createEntityManager(); <---- here 
    SomeObj s = em.find(SomeObj.class, injectableObj.getId()); 
    s.setSomeObj(injectableObj.getSomeObj()); 

} 

public void delete() 
{ 

    em = emf.createEntityManager(); <---- here 
    SomeObj s = em.find(SomeObj.class, injectableObj.getId()); 
    em.remove(s); 
} 

问:反正是有注入的EntityManager?

+0

你需要使用ThreadLocal这种类型的任务。请看这里http://www.naildrivin5.com/daveblog5000/?p=39和这里http://javanotepad.blogspot.com/2007/08/managing-jpa-entitymanager-lifecycle.html - 这是给更多实现细节 – 2012-07-31 14:14:39

回答

1

也许尝试在这里寻找exemples:

Injections EntityManager

我更喜欢使用:通过注射@PersistenceContext

+0

这是一个NoSQL数据库。事务类型是RESOURCE_LOCAL NOT JTA。这就是说,你不能使用PersistencContext并注入entitymanager。 – stackoverflow 2012-07-31 14:15:05

0

您可以使用注射。我使用它是这样的:

@PersistenceContext(unitName = "some_jndi_name") 
private EntityManager em; 
+0

这是一个NoSQL数据库(如unit_name =“mongo”所示)。事务类型是RESOURCE_LOCAL NOT JTA。这就是说,你不能使用PersistencContext并注入实体管理器 – stackoverflow 2012-07-31 14:16:15

+0

对不起,今天我不是一个细心的读者。 :( – gkuzmin 2012-07-31 14:54:44

+0

这很好,你有什么建议吗? – stackoverflow 2012-07-31 14:55:48