gpt4 book ai didi

java - 为什么我的集合初始化不起作用?

转载 作者:行者123 更新时间:2023-12-01 09:00:06 24 4
gpt4 key购买 nike

我有一个用 @Transactional 注释的服务类,调用 DAO 层方法来返回一个带有延迟加载集合的对象。当我尝试使用 Hibernate.initialize(..) 在服务层中初始化该集合时,hibernate 不会加载该集合。 DAO 配置为使用实体管理器,并且对象类使用 JPA 注释进行注释。我有以下 spring 应用程序上下文..

<beans xmlns="http://www.springframework.org/schema/beans"...">

<orcl:pooling-datasource id="dataSource" url="..." username="..." password="..."/>

<context:annotation-config/>

<!-- Hibernate entity manager -->
<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="org.gmp.webapp.model" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEmf" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<bean id="dao" class="org.gmp.webapp.dao.impl.HibDAOImpl" />
</beans>

我的 DAO 接口(interface)和实现...

package org.gmp.webapp.dao;

import java.util.List;
import org.gmp.webapp.model.Crime;

public interface DAO {
public Crime getCrime(String crimeNo);
}

import org.gmp.webapp.dao.DAO;
import org.gmp.webapp.model.Crime;

public class HibDAOImpl implements DAO {

@PersistenceContext
protected EntityManager em;

public Crime getCrime(String crimeNo) {
return this.em.find(Crime.class, crimeNo);
}

}

我的对象看起来像这样..

@Entity
@Table(name="CRIME_TABLE")
public class Crime {
@Id
@Column(name = "CRIME_NO")
private String crimeNo;
@OneToMany
@JoinColumn(name="PER_CRIME_NO", referencedColumnName="CRIME_NO")
private List<PersonCrimeLink> personLinks;
....
public List<PersonCrimeLink> getPersonLinks() {
return personLinks;
}
}

服务类用事务(spring)注释,所以我认为由于对 DAO 的调用和初始化在同一个事务中,这应该可以工作。我的服务..

@Service
@Transactional(readOnly=true)
public class CrimeServiceImpl implements CrimeService {

@Autowired private CrimeDAO crimeDAO;

public Crime getCrime(String crimeNo) {
Crime crime = crimeDAO.getCrime(crimeNo);
Hibernate.initialize(crime.getPersonLinks());
return crime;
}
}

当我运行 DAO 方法的测试并调用集合的 getter 时,会加载集合。我用@Transactional注释了测试方法。 personLinks 对象被省略,但就像我说的,它返回测试中的记录。我想我不理解我正在使用的事务管理器,因为这个过程在我使用 session 工厂和 HibernateTransactionManager 时起作用。非常感谢您对此提供任何指导。

最佳答案

对此有一个快速提示,当您决定使用 JPA 的 EntityManagerFactory 而不是 Hibernate 的 SessionFactory 作为您的 orm API 时,那么我会在应用程序的其他层上坚持使用该 API。

也就是说,使用 EntityManager 获取数据然后切换到使用实现 API (Hibernate.initialize) 并不是一种一致/可维护的方法。

就像您在帖子中所说,如果您坚持 JPA 规范,即在第一次访问集合时初始化集合,那么您不会收到任何错误并且会加载列表:

The LAZY strategy is a hint to the persistence provider runtime that data should be fetched lazily when it is first accessed

因此,根据 JPA 规范,您只需执行以下操作:

public Crime getCrime(String crimeNo) {
Crime crime = crimeDAO.getCrime(crimeNo);
crime.getPersonLinks().size(); // any access method
return crime;
}

关于java - 为什么我的集合初始化不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41745497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com