当前位置: 首页 > 知识库问答 >
问题:

惰性初始化使用Hibernate 4.1、Spring 3.1 和 JSF 1.2(我的面孔)的异常

韶云瀚
2023-03-14

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

每次尝试访问我的一个页面时,我都有这个“懒惰初始化异常”

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...
}

我的POJO服务实现HibernateEOWeb员工服务简单

@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配置文件:

<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>

是否有任何机构有提示来帮助我?我阅读了一些文章和帖子,但没有真正找到解决我的问题的方法

顺致敬意,

卡姆兰

共有3个答案

哈和惬
2023-03-14

您计划使用服务类中的SessionFactory归档什么?

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

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

濮赤岩
2023-03-14

我认为发生这种情况是因为您不在DAO类中使用事务。Hibernate将无法在事务之外与Spring一起使用。您可以使用Spring定义声明性事务(使用@Transactional注释注释必要的类)。以下是有关交易的Spring参考文档的链接。

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

@autowired
private SessionFactory sessionFactory;
范轶
2023-03-14

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

我向你推荐

@Transactional

注释。它应该能解决你的问题。

否则,以下是相关的Hibernate文档:会话和事务

 类似资料:
  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。

  • 我正在开发一个Struts2 Spring Hibernate webapp,我需要在检索一个对象或该对象的集合后初始化一个惰性集合。 用例 我有一个团队模型,其关系被热切地加载为员工(我认为这显然是一个集合)。反过来,员工模型有一个懒惰的关系注册表,我只需要一些特定的操作,所以我根本不需要急切地加载它。 现在。我调用我的(用Spring注入到我的Struts2控制器中),以便检索一个特定的已经加

  • 延迟初始化 是一种允许我们延迟初始化消耗资源比较大的进程,直到需要他们的时候(才初始化)。这其中的一个例子就是jQuery的.ready()方法,它在DOM节点加载完毕之后会执行一个回调方法。 $( document ).ready( function () { //ajax请求不会执行,直到DOM加载完成 var jqxhr = $.ajax({ url: "ht

  • 问题内容: 在我的JavaFX应用程序中,当我对EmbeddedId类使用 Non Lazy Collection 选项时,为了保持双向关系,它将产生以下异常。经过几个小时的工作后,我仍然无法解决它。实体类如下。谢谢。 EmbeddedId类 WorkflowStep实体 (带有EmbeddedId) WfScriptTemplate实体 (带有双向关系) PostgreSQL异常 MySQL异常

  • 问题内容: 创建单例的模式似乎是这样的: 但是我的问题是,如果Singleton构造函数执行的不是单元测试友好的操作,例如如何调用外部服务,jndi查找等,您如何使用这样的类进行单元化? 我想我可以像这样重构它: 现在的问题是,仅出于单元可测试性,我已强制将getInstance同步,因此仅出于测试方面,它将对实际应用程序产生负面影响。有没有解决的办法,由于Java中双重锁定模式的破坏性,似乎其他

  • 我在想Spring中bean的懒惰初始化。对我来说,这里的“懒惰”是否意味着当一个bean被引用时会被创建并不十分清楚。 我认为Spring中的延迟初始化支持是不同的。我认为这是一个基于“方法调用”的惰性创建。我的意思是,每当对该方法调用任何方法时,都会创建该方法。 我认为这可以通过创建特定bean的代理实例并对任何方法调用进行初始化来轻松解决。 我是否遗漏了一些东西?为什么没有实施?这个概念有什