使用时guice-persist
,EntityManager
是事务范围的。如果我理解正确的话,这意味着EntityManager
将为每笔交易创建一个新的。使用时guice-persist
,建议使用JpaPersistModule
,它提供了所有的绑定,并简单地注入Provider<EntityManager>
到某个类中,就像这样:
public class ProjectDAO {
private final Provider<EntityManager> entityManagerProvider;
@Inject
public ProjectDAO(Provider<EntityManager> entityManagerProvider) {
this.entityManagerProvider = entityManagerProvider;
}
}
现在,我试过了,每个线程都有自己的EntityManager
. 然而,它似乎并没有被移除并重新设置,而是被重新用于后续事务,即Hibernate的一级缓存没有被清除。
这是一个完整的示例,它从两个不同的线程(顺序地,而不是并行地)插入和删除一些实体,这会导致一个线程具有陈旧的信息:
项目(一个简单的实体)
@NamedQueries({
@NamedQuery(name = "project.findAll", query = "from project"),
@NamedQuery(name = "project.deleteByProjectName", query = "delete from project p where p.name = :project_name")
}
)
@Entity(name = "project")
public class Project {
@Id
@GeneratedValue
private Long id;
@Column(name="name")
private String name;
// ... getters/setters
}
项目DAO
public class ProjectDAO {
private final Provider<EntityManager> entityManagerProvider;
@Inject
public ProjectDAO(Provider<EntityManager> entityManagerProvider) {
this.entityManagerProvider = entityManagerProvider;
}
public void insert(Project project) {
entityManagerProvider.get().persist(project);
}
public List<Project> findAll() {
return entityManagerProvider.get()
.createNamedQuery("project.findAll", Project.class)
.getResultList();
}
江户川乱折腾
相关分类