【问题标题】:Java Hibernate Generic DAO with mode attribute具有模式属性的 Java Hibernate 通用 DAO
【发布时间】:2014-10-20 10:03:03
【问题描述】:

我正在编写 abstract/generic DAO 函数来执行 Hibernate 创建、更新、查找、删除查询。

在更新功能的情况下,我想检查一个名为 mode 的特定属性是否设置为 0,这意味着记录是可更新的(0-读/写,1-删除,2-只读)。 因此我需要访问对象的getMode函数,所以我不能简单地调用一个不知道该属性存在的通用更新函数。

我怎样才能编写一个假设存在属性模式的通用更新函数,有可能吗?

session = factory.openSession();
tx = session.beginTransaction();
if(at.getMode() == 0){
   session.update(at);
}
tx.commit();
session.close();

【问题讨论】:

    标签: java hibernate generics dao


    【解决方案1】:

    我以前也遇到过类似的情况。在我工作的系统中,所有表都有一个最后更新的时间戳,因此每当发生更新时,通用方法会使用当前时间更新字段,然后执行更新。

    请记住,这可能不是唯一的解决方案。

    在我的例子中,所有实体都实现了一个接口。对于您的情况,接口应该是这样的:

    public interface HasModeAttribute {
    
    //assumed mode is an int
    int getMode();
    
    }
    

    在您的通用 DAO 中,您所要做的就是正确声明一个接受所有实现此接口的类的通用方法:

    (...)
        //omitted class declaration here 
        public <T extends HasModeAttribute> void yourUpdate(T entity) {
            session = factory.openSession();
            tx = session.beginTransaction();
            if(entity.getMode() == 0){
               session.update(entity);
            }
            tx.commit();
            session.close();
        }
    
    (...)
    

    就是这样。

    这个解决方案的缺点是你必须让你的所有实体都实现这个新接口,但我认为这是一个很小的代价。好处是编译器会检查所有这些。

    【讨论】:

    • 您总是可以通过检查实体是否是接口的实例来检查给定实体是否实现了该接口。
    • 这应该也可以。这是一种更简单的方法,但是您必须考虑如果实体未实现接口该怎么办。还是会更新?抛出异常?没什么大不了的,但是使用泛型可以确保这只会在特定的一组实体上执行。
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2011-07-06
    • 2017-02-26
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多