通用的数据库/Dao方法应该是静态的吗?

4

我有一个方法,它在我的代码中从不同的位置被使用了3-4次。通常情况下,我们会引入一个静态实用方法来解决这个问题,我也这样做了。

但是我想知道,如果这个静态方法执行一些数据库/dao逻辑,这是否是一种好的实践?请看以下伪代码示例:

class DaoUtiliy {

    public static void updateToDB(List a, List b) {
        Dao dao = new Dao();
        dao.open(); //begin transaction     

        //create some variables using the list a, that are used to fetch the db entry:
        String time, String date; //some more
        Entity entity = dao.find(time, date);

        //update anything in that entity;
        entity.setProperty(b.get(0));

        dao.close(); //commit transaction
    }   
}

您是否将其放在静态方法中?还是创建一个new DaoService().updateToDB(a, b);,并从需要它的地方调用该方法?

你是在Dao的构造函数中分配Hibernate Sessions吗?还是它们在ThreadLocal中,然后被获取? - Affe
我正在dao中实例化时获取EntityManager: EntityManager em = EMUtil.get(); - membersound
EMUtil是从哪里获取的?我的意思是,虽然这很好,但它不允许您更改会话生命周期或扩展工作单元的范围,随着您的需求增长和项目发展。您与所有工作单元耦合在一起,被定义为独立的静态方法,这变得很丑陋。 - Affe
EntityManagerFactory 中获取它等。我知道我的例子可能不是用于数据库访问的灵活性最高的一个,但我的问题更关注执行数据库操作的方法的架构设计,而不是实体管理器。 - membersound
1个回答

6

我更喜欢DAO中的非静态方法,原因如下:

  1. 将它们设置为非静态方法会更容易使用像Spring这样的框架注入值
  2. 对于静态方法来说编写单元测试用例并不容易,因为它们无法被覆盖
  3. 如果你想要扩展DAO的功能,静态方法的覆盖是不可能的

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接