Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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延迟加载使条件运行缓慢_Java_Hibernate_Hibernate Criteria - Fatal编程技术网

Java Hibernate延迟加载使条件运行缓慢

Java Hibernate延迟加载使条件运行缓慢,java,hibernate,hibernate-criteria,Java,Hibernate,Hibernate Criteria,我遇到了hibernate和延迟加载对象的问题。 基本上我想加载一个类,它有一个急切加载的字段,而不是加载子类的惰性字段 参加下面的课堂提问 @Entity @Table(name = "question") public class QuestionVO extends BaseDAOVO implements Serializable { /** * */ private static final long serialVersionUID =

我遇到了hibernate和延迟加载对象的问题。 基本上我想加载一个类,它有一个急切加载的字段,而不是加载子类的惰性字段

参加下面的课堂提问

    @Entity
@Table(name = "question")
public class QuestionVO extends BaseDAOVO implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -5867047752936216092L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Integer id;

    @Column(name = "questionText", unique = false, nullable = false, length = 4000)
    @Size(min = 3, max = 4000)
    @Pattern(regexp = MobileAppsRegexConstants.GENERAL_ALLOWED_CHARCHTERS, message = "Question Text Not valid.")
    private String questionText;

    @ManyToOne(fetch = FetchType.EAGER)
    @Cascade({ CascadeType.SAVE_UPDATE })
    @JoinColumn(name = "MENU_STYLE_ID", nullable = true)
    private MenuStyleVO menuStyle;

    }
选择下面的MenuStyleVO类

   @Entity
@Table(name = "menu_style")
public class MenuStyleVO extends BaseDAOVO implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 3697798179195096156L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Integer id;

    @Column(name = "menuStyleName", unique = false, nullable = false, length = 200)
    private String menuStyleName;

    @Column(name = "menuTemplate", unique = false, nullable = false, length = 200)
    private String menuTemplate;

    @OneToOne(fetch = FetchType.LAZY, optional=false)
    @Cascade({ CascadeType.SAVE_UPDATE })
    @JoinColumn(name="logo_id")
    @JsonProperty("logo")
    private ApplicationImageVO logo;


    }
这个ApplicationImageVO类

@Entity
@Table(name = "application_image")
public class ApplicationImageVO extends BaseDAOVO implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -9158898930601867545L;

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "image1242x2208")
    @Cascade({ CascadeType.ALL })
    @JsonIgnore
    private SubmissionLauncherImagesVO launcherImage1242x2208;  

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "image1536x2048")
    @Cascade({ CascadeType.ALL })
    @JsonIgnore
    private SubmissionLauncherImagesVO launcherImage1536x2048;  

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "image2048x1536")
    @Cascade({ CascadeType.ALL })
    @JsonIgnore
    private SubmissionLauncherImagesVO launcherImage2048x1536;  

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "logo")
    @Cascade({ CascadeType.ALL })
    @JsonIgnore
    private MenuStyleVO menuStyleLogo; 

    }
如果我使用下面的hibernate标准代码从数据库中加载QuestionVO类,那么MenuStyleVO和ApplicationImageVO的所有惰性字段也会被加载

在复杂的用例中,这会导致查询变得非常缓慢

public QuestionVO findMasterAppQuestionById(int id) {

    Criteria criteria = currentSession().createCriteria(QuestionVO.class);
    criteria.add(Restrictions.eq("id", id));

    QuestionVO questionVO  = (QuestionVO) criteria.uniqueResult();

    return questionVO;
}
我想知道的是——是否可以加载QuestionVO类及其急切字段,并告诉hibernate忽略其他类中的惰性字段,而不忽略那些需要的字段

干杯
Damien上次我们遇到这样的问题时,我们在父类上使用了构造函数,它只使用所需的已确定查询字段

我不完全记得jpql查询中的构造函数是如何工作的,但它必须是这样的:

select new com.package.class(c.field1, c.field2) from com.package.class c
请记住,所需实体上必须存在具有相同参数的构造函数

优点: -更好的查询性能; -可以与其他参数一起复制

缺点: -相当有限,你只能在你查询的主要实体上使用这个黑客; -仅包含用于确定查询的构造函数,设计不佳

另外,您应该看看JPA的EnttyGraphs。看起来很有希望,但在我们的项目中没有达到预期效果

顺便说一句,Hibernate已经多次向我们提出性能问题,希望这个黑客可以帮助你,祝你好运

编辑:

为什么这种模式有助于解决性能问题?
基本上,在我之前展示的示例中,您没有通过Hibernate加载所有内容,只有主实体的两个字段(field1和field2)。如果不使用构造函数,您就不能这样做,因为您的查询不会生成所需实体的集合,而是每次迭代生成两个对象的集合(对象[])。使用构造器模式,您正在创建所需实体的实例,但只从数据库中选择了几个字段,这就是为什么此模式可以帮助您,您正在返回所需实体的集合,其中只包含几个字段。

您好,谢谢您回复我。如果我们通过hibernate加载所有内容,我不确定一个构造函数能在这里提供什么帮助。你能进一步解释吗?更新了答案,请查看。嗨-谢谢更新。我明白你所说的黑客是什么意思。这是可能的,但希望有人能想出另一个选择。尽管如此,您的输入还是很受欢迎的,这没关系,遗憾的是,Hibernate可以通过太多类型的实现来使用,我想说,几乎不可能给出一个在每个Hibernate项目中都适用的解决方案,让我们看看其他人是否为我们提供了解决这个问题的其他方法。我完全理解。这些性能问题有时会有点令人沮丧。希望会出现其他一些适合我们两个需求的替代方案