Hibernate CDI&x2B;JPA Multiple@OneToMany-LAZY/EAGER-LazyInitializationException或无法实例化多个行李

Hibernate CDI&x2B;JPA Multiple@OneToMany-LAZY/EAGER-LazyInitializationException或无法实例化多个行李,hibernate,jpa,cdi,one-to-many,Hibernate,Jpa,Cdi,One To Many,我正在使用JBossAS7、CDI、JPA和其他捆绑资源开发一个应用程序 我的问题是:当我在Eclipse中使用maven jboss webapp原型创建一个项目时,它会生成一些文件,我一直在广泛地研究并尝试处理这些文件。问题是,有时我觉得自己有点困惑,是使用Hibernate资源还是JPA资源 第二个问题:当我在同一实体中使用多个@OneToMany关系时,我注意到两种行为: a) 在没有为Fetch指定急切类型的情况下,它会部署应用程序,但是当我尝试使用列表时,它会给我一个LazyInit

我正在使用JBossAS7、CDI、JPA和其他捆绑资源开发一个应用程序

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

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

a) 在没有为Fetch指定急切类型的情况下,它会部署应用程序,但是当我尝试使用列表时,它会给我一个LazyInitializationException错误,这里讨论了很多

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

下面是一段有问题的代码:

@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;
}
@OneToMany(cascade=CascadeType.ALL,mappedBy=“teamUser”,fetch=FetchType.EAGER)
私人收藏用户收藏;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“teamRanking”,fetch=FetchType.LAZY)
私人收藏和私人收藏;
@NotNull
@OneToMany(cascade=CascadeType.ALL,mappedBy=“teammodity”,fetch=FetchType.LAZY)
私人收藏模式收藏;
公共团队(){
}
公共团队(长id_团队,字符串名称){
this.id=id\u团队;
this.name=名称;
}
我一直在读这篇文章,有人告诉我JPA不支持FetchType.Anger在同一个实体中建立多个关系。但我需要在这个实体中具体使用多个关系。我不知道该怎么办了,因为我已经尝试了几种方法,懒散抓取,所有这些方法都存在某种问题。例如,如果我在类中只留下一个FetchType.EAGER,那么它将部署我的应用程序,但它无法正常运行,因为当我尝试从数据库中获取列表时,它会给出错误:LazyInitializationException,当我尝试使用FetchType.EAGER将所有包都放在一起时,它不会部署,因为它会给出错误:无法实例化多个包

因此,我这里的问题与:

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

首先,Hibernate是JPA规范的一个实现,是JBoss中的默认实现。所以您使用的是JPA,以Hibernate作为实现

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


您可以一次获取多个toMany关联,但其中只有一个可以是包(即集合或列表)。一般来说,我不建议急于收藏。但是如果你真的想要它们,就让它们成为集合而不是集合。

首先,Hibernate是JPA规范的一个实现,是JBoss中的默认实现。所以您使用的是JPA,以Hibernate作为实现

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


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

您使用的是什么JPA实现?Hibernate?是的,我正在使用JBossAS7中捆绑的Hibernate,我认为这就是Hibernate4。谢谢你的回答,约翰,你可能应该看看这个,以便参考:它使用特定于Hibernate的注释,但可以做你需要的事情。你使用的是什么JPA实现?Hibernate?是的,我正在使用JBossAS7中捆绑的Hibernate,我认为这就是Hibernate4。谢谢你的回答。约翰,你也许应该看看这个,以便参考:它使用特定于Hibernate的注释,但可以做你需要的事情。我非常感谢你的解释。这让事情变得更清楚了。你能看看我的一种刀法吗?因为我不知道你所说的事务服务方法到底是什么意思。因为我没有使用诸如commit之类的方法从数据库检索数据。[code]public List retrieveAllMemberSorderDByname(){List teams=null;CriteriaBuilder cb=em.getCriteriaBuilder();CriteriaQuery criteria=cb.createQuery(teams.class);Root成员=criteria.from(teams.class);criteria.select(member).orderBy(cb.asc(member.get(member.name));criteria.select(member).orderBy(cb.asc(member.get(“name”));teams=em.createQuery(criteria).getResultList();return teams;}如果要添加代码,请编辑您的问题。您必须使用事务来访问实体管理器。在Java EE环境中,例如部署在JBoss上并使用CDI的应用程序,这非常简单,只需将带有@Stateless注释的服务类设为会话EJB。EJB默认为事务性的。JB N
SomeEntity e = em.find(SomeEntity.class, someId);
e.getFirstCollection().size(); // initialize the first collection
e.getSecondCollection().size(); // initialize the second collection
return e;