- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用 @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/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!