我在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()中:
我首先得到并反对然后更新它。但是可能有一些其他线程在更新值之前也读取相同的值。如何避免这种情况?