我有一个 User
Entity
映射 User
的类MySQL 数据库中的表。这是使用 Eclipse 中的 Hibernate 工具自动生成的。
然后,我写了一个通用的 DAO 接口(interface):
package dal.genericdao;
public interface GenericDAO <EntityClass, IDClass> {
EntityClass create(EntityClass entity);
void delete(IDClass id);
EntityClass findById(IDClass id);
EntityClass update(EntityClass entity);
}
在 GenericDAOImpl
中实现使用 EntityManager
的类用于 CRUD 操作。这是它的一个片段
package dal.genericdao;
import javax.persistence.PersistenceContext;
public class GenericDAOImpl<EntityClass, IDClass> implements GenericDAO<EntityClass, IDClass> {
@PersistenceContext private EntityManager entityManager;
// ---- In the original post I omitted this piece of code for shortness. It only retrieves the runtime EntityClass ----
private Class<EntityClass> entityClass;
@SuppressWarnings("unchecked")
public GenericDAOImpl() {
entityClass = (Class<EntityClass>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
}
// --------------
@Override
public EntityClass create(EntityClass entity)
{
entityManager.getTransaction().begin();
entityManager.persist(entity);
entityManager.flush();
entityManager.getTransaction().commit();
return entity;
}
@Override
public void delete(IDClass id)
{
...
}
@Override
public EntityClass findById(IDClass id)
{
...
}
@Override
public EntityClass update(EntityClass entity)
{
...
}
}
所以 UserDAO
这是
import dal.genericdao.GenericDAOImpl;
import dal.User;
import javax.enterprise.inject.Default;
@Default
public class UserDAO extends GenericDAOImpl<User, String> {
}
如果我在 UserDAO
上运行一些测试类一切都按预期工作。
当我尝试坚持(通过 UserDAO.create()
方法)一个 Entity
时,问题就出现了。已经存在于数据库中。事实上,entityManager.persist(entity)
方法不会警告我是否坚持存在的实体(理论上应该引发主键约束违规)。
此外,在 entityManager.persist(entity)
方法我无法访问 Entity
标识符值,因为它被通用 IDClass
“隐藏”了类(因此我无法运行 GenericDAOImpl.findById(IDClass)
来验证 Entity
在持久化操作之前是否存在)。
你怎么看待这个问题?你会如何解决这个问题?
谢谢
最佳答案
考虑使用 Spring 框架。 Spring-Data-JPA项目具有出色的存储库实现。在其他功能中,它们消除了检查现有实体的负担。
关于java - 使用 EntityManager 验证实体的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24166292/