1

我有一个使用 Hibernate 4.1 和 Spring 3.1 和 JSF 1.2 (myFaces) 的 webapp。

每次尝试访问我的一个页面时,我都会遇到此“LazyInitializationException”

Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at £org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:149)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:195)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at foo.data.bo.implementations.EOServiceType_$$_javassist_10.getTechKey(EOServiceType_$$_javassist_10.java)
at foo.converter.EOServiceTypeConverter.getAsString(EOServiceTypeConverter.java:36)
at org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:648)
at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils.getSubmittedOrSelectedValuesAsSet(HtmlRendererUtils.java:362)
at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:337)
at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils.renderMenu(HtmlRendererUtils.java:288)
at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlMenuRendererBase.encodeEnd(HtmlMenuRendererBase.java:57)
at org.apache.myfaces.renderkit.html.ext.HtmlMenuRenderer.encodeEnd(HtmlMenuRenderer.java:70)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:649)
... 50 more

我想我误解了一些东西,因为我不知道如何为我的班级提供“会议”。

有关信息,这是我的一些配置文件:

弹簧配置.xml:

<context:annotation-config />
<context:component-scan base-package="foo" />

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="namingStrategy">
        <ref bean="oracleNamingStrategy" />
    </property>
</bean>

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

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
     <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<alias name="jndiDataSource" alias="dataSource" />

<bean name="oracleNamingStrategy"
      class="org.hibernate.cfg.ImprovedNamingStrategy">
</bean>

<bean name="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:comp/env/jdbc/fooDS</value>
    </property>
</bean> 

我的 java 类 EOServiceType

@Entity
@Table(name="EOSERVICETYPE")
public class EOServiceType implements IEOServiceType {

@Id
@Column(name="EOSERVICETYPE_ID")
private long techKey; 

@Column(name="H_PROPERTY")
private String property;

@Column(name="H_DESCRIPTION")
private String description;

//... + all getters and setters
}

我的 Hibernate EOServiceTypeDaoHibernateImpl 的 DAO 实现

@Repository("eOServiceTypeDao")
public class EOServiceTypeDaoHibernateImpl implements IEOServiceTypeDao {

@Autowired
private SessionFactory sessionFactory;

    public void save(IEOServiceType serviceType) {
    sessionFactory.getCurrentSession().save(serviceType);
}

public void update(IEOServiceType serviceType) {
    sessionFactory.getCurrentSession().update(serviceType);
}

    //... and some other CRUD operations...
}

我的 Hibernate EOWebStaffServicesImpl 的 POJO 服务实现

@Service
public class EOWebStaffServicesImpl implements IEOWebStaffServices {

@Autowired
private SessionFactory sessionFactory;

//...

@Autowired
private IEOServiceTypeDao eoServiceTypeDao;

    public void saveOrUpdateEOServiceType(IEOServiceType eoServiceType) {
    try {
        eoServiceTypeDao.saveOrUpdate(eoServiceType);
    } catch (DataIntegrityViolationException e) {
        DuplicateKeyException exception= new DuplicateKeyException("Duplicate business key for " + eoServiceType,e);
        throw exception;
    }
}
    public void deleteEOServiceType(IEOServiceType eoServiceType) {
    eoServiceTypeDao.delete(eoServiceType);
}

我的休眠配置文件:

<hibernate-configuration>
<session-factory>
    <property name="hibernate.mapping.precedence">hbm, class</property>    
<property name="show_sql">false</property>
<property name="format_sql">true</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="jdbc.batch_size">20</property>

    <mapping class="foo.data.bo.implementations.EOServiceType"/>
    <!-- ... and other mappings -->
</session-factory>
</hibernate-configuration>

有没有人有提示可以帮助我?我阅读了一些文章和帖子,但并没有真正找到解决问题的方法。

此致,

卡姆兰

4

3 回答 3

1

几周前我遇到了同样的问题。我显然忘记注释Hibernate交互的方法。

我向你推荐

@Transactional

注解。它应该可以解决您的问题。

否则这里是相关的Hibernate文档: Sessions and Transactions

于 2012-07-11T07:44:46.953 回答
0

我认为这是因为您没有在 DAO 类中使用事务。Hibernate 不能在事务之外与 Spring 一起工作。您可以使用 Spring 定义声明性事务(使用 @Transactional 注释注释必要的类)。这是有关 Transactions 的 Spring 参考文档的链接。

此外,您应该在使用之前将 SessionFactory 注入到您的 bean 中:

@autowired
private SessionFactory sessionFactory;
于 2012-07-11T07:39:44.213 回答
0

你打算SessionFactory在你的服务类中存档什么?

无论如何,我认为问题在于您正在尝试访问具有惰性属性的分离对象。(当您看到该异常时通常就是这种情况)

这就是您 POJO 的所有代码吗?

于 2012-07-11T09:05:55.717 回答