gpt4 book ai didi

java - 使用 EntityManager 验证实体的唯一性

转载 作者:行者123 更新时间:2023-11-30 23:00:43 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com