0

我正在使用 Jboss AS 7、CDI、JPA 和捆绑的其他一些资源开发应用程序。

我的问题是:当我使用 maven-jboss-webapp-archetype 在 Eclipse 中创建一个项目时,它会生成一些文件,我一直在广泛研究并试图与之相处。问题是,有时我觉得自己是在使用 Hibernate 资源还是 JPA 资源有点困惑。

第二个问题:当我在同一个实体中使用多个 @OneToMany 关系时,我注意到两种行为:

a) 如果没有为 Fetch 指定 EAGER 类型,它会部署应用程序,但是当我尝试使用该列表时,它会给我带来 LazyInitializationException 错误,因此在这里进行了广泛讨论。

b) 当我在 @*ToMany 关系上为 FetchType 指定 Eager 时,它只是不部署应用程序。它给了我错误:无法实例化多个包。

这是有问题的代码段:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "teamUser" , fetch = FetchType.EAGER)
private Collection<Users> usersCollection;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "teamRanking" , fetch = FetchType.LAZY)
private Collection<Ranking> rankingCollection;

@NotNull
@OneToMany(cascade = CascadeType.ALL, mappedBy = "teamModality" , fetch = FetchType.LAZY)
private Collection<Modality> modalitiesCollection;

public Teams() {

}

public Teams(Long id_team , String name) {
    this.id = id_team;
    this.name = name;
}

我一直在阅读这方面的内容,人们告诉我 JPA 不支持 FetchType.EAGER 用于同一实体中的多个 realtionships。但我需要在这个实体中具体使用多个关系。我不知道该怎么办了,因为我尝试了几种方法,Lazy fetching,所有这些方法都存在某种问题。例如,如果我在课堂上只留下一个 FetchType.EAGER ,那么它会部署我的应用程序,但它无法正常运行,因为当我尝试从数据库中获取 List 时,它会给我错误:LazyInitializationException,当我尝试将它们全部使用 FetchType.EAGER 它只是没有部署,因为它给出了错误:无法实例化多个包。

所以我在这里的问题与:

1) Maven-jboss-webapp-archetype 使用 hibernate 或 jpa 或两者兼而有之?2)如何解决在实体中使用多个@OneToMany 关系的问题?尽管我知道急切地获取模型中的集合并不是最好的方法,因为当系统增长时,我可能会遇到性能问题,对吧?那么如何才能正确使用延迟加载呢?

4

1 回答 1

3

首先,Hibernate 是 JPA 规范的一种实现,是 JBoss 中的默认实现。因此,您正在使用 JPA,并使用 Hibernate 作为实现。

其次,您得到一个 LazyInitialization 异常,因为您在关闭会话后访问了一个延迟加载的集合,而在会话仍然打开时没有初始化该集合。如果您有两个惰性集合并且您知道客户端代码都需要初始化,请在返回实体并关闭会话之前初始化它们(即,当您仍在事务服务方法中时):

SomeEntity e = em.find(SomeEntity.class, someId);
e.getFirstCollection().size(); // initialize the first collection
e.getSecondCollection().size(); // initialize the second collection
return e;

您可以一次获取多个 toMany 关联,但其中只有一个可以是包(即 Collection 或 List)。我一般不建议急切的收藏。但是,如果您真的想要它们,请将它们设置为集合而不是集合。

于 2013-05-18T21:00:24.870 回答