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

标签 java mysql hibernate jpa

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

相关文章:

java - Android DownloadManager 不知道文件下载到哪里

php - 在用户键入消息时显示字数并将字长限制为 300 个字

python - Django session 中的当前字段值

java - 从手工制作的 hibernate 映射文件转向注释是否值得?

java - JPA cascade = REMOVE 和 Hibernate @OnDelete 一起使用?

Java nio2 目录没有关闭。导致 "too many open files"错误

java - 使用Java获取OS X应用程序名称菜单

java - Hibernate 中 n 个表到 1 个类的运行时单向映射

java - 为什么程序员说 "pass by reference"真的是 "passing references by value?"为什么这很重要?

mysql - (MySQL) 加载文件特定列中的数据