【问题标题】:LazyInitializationException with Hibernate 4.1, Spring 3.1 and JSF 1.2 (Myfaces)LazyInitializationException 与 Hibernate 4.1、Spring 3.1 和 JSF 1.2 (Myfaces)
【发布时间】:2012-07-11 07:26:39
【问题描述】:

我有一个使用 Hibernate 4.1 和 Spring 3.1 和 JSF 1.2 (myFaces) 的 web 应用程序。

每次我尝试访问我的一个页面时都会出现此“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

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

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

spring-config.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>

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

最好的问候,

卡姆兰

【问题讨论】:

    标签: java spring hibernate mapping lazy-initialization


    【解决方案1】:

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

    我推荐你

    @Transactional
    

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

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

    【讨论】:

    • 哇,我遇到了确切的问题。 @Transactional 解决了这个问题。赞成
    • 亲爱的亚当,感谢您的回答。我的服务已经在班级级别使用“@transactionnal”进行了注释。但我的问题不是在使用服务时,而是在我直接使用“EOServiceType”时。我将编辑我的帖子并添加我的 DAO 和服务
    【解决方案2】:

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

    您还应该在使用之前将 SessionFactory 注入到您的 bean:

    @autowired
    private SessionFactory sessionFactory;
    

    【讨论】:

    • 亲爱的 Dimas,感谢您的帮助。我已经在我的 DAO 中注入了 sessionFactory。 (我将在帖子中添加我的 DAO 和服务)
    • 我看到了你的版本。我认为问题在于您也必须在 DAO 类上使用 @Transactional 注释。不仅在服务级别。
    • 顺便贴一下你的休眠配置。
    • 我添加了休眠配置文件。同时,我在我的 DAO 中添加了@Transactional(在类级别而不是方法级别)。但我仍然有问题。我还将它添加到我的“映射”bean EOServiceType(只是为了好玩)但没有更好的结果:-(
    【解决方案3】:

    您打算在服务类中使用SessionFactory 归档什么?

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

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

    【讨论】:

    • 亲爱的 ortang,这正是您所说的:我正在尝试访问一个惰性的分离对象。对于 POJO,我删除了一些其他方法。我只是为了展示它的样子(600 行:-p)
    猜你喜欢
    • 2012-06-28
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多