事务和entityManager如何与JPA和Google Guice一起使用?

时间:2017-12-04 03:13:00

标签: java hibernate jpa jpa-2.0 guice

我在Google Guice中使用JPA / Hibernate。
我面临疑问:1)我是否需要关闭实体经理?2)我什么时候需要开始交易并提交?3)对于那里的服务请求可以是多个DAO的请求来提供请求,在这种情况下,我是否需要开始和关闭事务,还是会自动处理?

服务等级:

public class StudentService {

@Transactional
public Integer updateStudentName(int id, String name) {
     Student student = studentDAO.getById(id);
     student.setName(name);
     studentDAO.update(student);
     Account account = AccountDAO.getById(id);
     account.setAccountHolderName(name);
     accountDAO.update(account);
}

@Transactional
public void communicateViaMultipleDAOs(..... multiple Constraints) {
   DAO1.updateBySomeConstraints(....);
   DAO2.updateBySomeConstraints(....);
   DAO3.updateBySomeConstraints(....);
}

}

学生DAO:

public interface StudentDAO {
     void update(Student student);
     Student getById(int id);
     void updateByOtherParam(String name, String balance);
}


public class StudentDAOImpl implements StudentDAO {

   Provider<EntityManager> entityManagerProvider;

   public getEntityManager(){
       return entityManagerProvider.get();
   }

   void update(Student student) {
   }

   Student getById(int id) {
   }

   void updateByOtherParam(String name, String balance) {
       EntityManager em = getEntityManager();
       /**
       Intializing CriteriaBuilder
       Doing Join
       Adding predicates ( condition in where clause)
       executing update
       **/ 
   }
}

同样,还有很多其他DAO 在上面的DAO中,我只是获取EntityManager并进行更新/选择操作 我没有使用
entityManager.getTransaction()。begin(),
entityManager.getTransaction()。commit(),
entityManager.close()。


它会产生任何问题吗?


在上面的服务层函数updateStudentName()中:
我首先得到并反对然后更新它。但是可能有一些其他线程在更新值之前也读取相同的值。如何避免这种情况?

0 个答案:

没有答案