Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate-dao设计问题_Java_Hibernate_Design Patterns_Orm_Dao - Fatal编程技术网

Java hibernate-dao设计问题

Java hibernate-dao设计问题,java,hibernate,design-patterns,orm,dao,Java,Hibernate,Design Patterns,Orm,Dao,我希望在我的hibernate应用程序中创建一个通用DAO来处理CRUD。我的实体与惰性抓取的关联最多。但我发现为了让hibernate尽可能有效地进行选择,我必须在DAO上创建多个方法。我的意思是: 实体A有两个关联。有时我希望在不加载关联的情况下检索该实体,有时我希望它完全填充,因此我在DAO上放置了两个方法: getWhatever() getWhateverWithLoadedAssociations() 我有两个不同的查询,一个没有join-fetch,另一个有join-fetch。

我希望在我的hibernate应用程序中创建一个通用DAO来处理CRUD。我的实体与惰性抓取的关联最多。但我发现为了让hibernate尽可能有效地进行选择,我必须在DAO上创建多个方法。我的意思是:

实体A有两个关联。有时我希望在不加载关联的情况下检索该实体,有时我希望它完全填充,因此我在DAO上放置了两个方法:

getWhatever()
getWhateverWithLoadedAssociations()
我有两个不同的查询,一个没有join-fetch,另一个有join-fetch。结果是hibernate总是执行一次选择,不管它是否懒惰,因为我知道我想要做什么

问题是,在保存一两个SELECT时,由于方法的数量增加了复杂性

那么这是不是太极端了?当我需要关联的数据时,我是否应该只使用getWhatever()并让hibernate执行另一个选择,即使我可以通过不执行该选择来保存数据

我希望这不会太令人困惑。我试图计算出由于延迟加载而导致的选择次数与代码复杂性之间的成本


谢谢

所以你的问题是你可能有太多的方法?我认为这是对的,因为这些方法做了不同的事情

如果要减少数量,并且使用HQL,则可以向方法中添加一个参数,该参数表示是否要加入获取关系:

获取任何内容(WhateverFetchMode f)

其中f可以是布尔值,也可以是返回字符串的HQL片段的对象,该字符串提供要获取的关系

public List<MyObject> getList(boolean fetchProp1) {
         return em.createQuery("select r" +
                "from Object as r " +
                fetchProp1 ? "left join fetch r.prop1 " : "")
                .getResultList();
}
public List getList(boolean fetchProp1){
返回em.createQuery(“选择r”+
“从对象作为r”+
fetchProp1?“左连接fetch r.prop1:”)
.getResultList();
}

public List getList(WhateverFetchMode fetchProp1){
返回em.createQuery(“选择r”+
“从对象作为r”+
fetchProp1.toHql())//这将返回正确的联接获取
.getResultList();
}
您可以有一个通用(在基类中)dao方法:

public void initialize(Object entity);

在这里调用
Hibernate.initialize(实体)

我认为这可能是过早的优化。换句话说,除非您确定存在性能问题,否则不要这样做

现在让Hibernate做它的惰性抓取,如果应用程序太慢,你可以只在需要的地方添加这些方法

那么这是不是太极端了?当我需要关联的数据时,我是否应该只使用getWhatever()并让hibernate执行另一个选择,即使我可以通过不执行该选择来保存数据

如果启用了惰性关联/获取,那么如果不需要关联的代码段调用
getwhater()
getwhateverwithloadedaassociations()
,会有什么区别?它将导致相同数量的SQL查询

如果您只有一个
getwhere()
方法,请检查这些可能性:

  • 一段代码不会访问关联-不会触发用于加载关联的SQL查询
  • 一段代码确实可以访问关联-触发用于加载关联的SQL查询
  • 在这两种情况下,关联仅在需要时加载


    延迟加载的目的是让您不必担心这类事情——如果调用DAO方法的代码访问了关联,那么它就会被加载;如果不是,就不是

    在我看来,是的,你太极端了

    除非您正在开发一个包含数千个查询的批处理过程,否则执行一个查询与hibernate在加载lazyly时执行的查询之间没有太大区别


    无论如何,如果您已经证实了对应用程序性能的担忧,那么您刚才提出的做法并不坏。

    IMHO,我将在通用DAO中添加以下方法:

    findById(Id id);//lazy load
    loadTree(Id id);//load full graph of the entity
    load(Id id, String... includePaths);// just load some associations of the entity
    

    我想问题在于,使用一个带有获取主对象和关联的连接的查询时,性能的差异。这比Hibernate使用多个查询要好。
    findById(Id id);//lazy load
    loadTree(Id id);//load full graph of the entity
    load(Id id, String... includePaths);// just load some associations of the entity