java - Hibernate LazyInitializingException

标签 java hibernate lazy-initialization

例如,我有 2 节课。第一个

@Entity
@Table(name = "employee")
public class Employee implements Serializable{

    @ManyToOne
    @JoinColumn(name = "office_address_id")
    private Address address;

    //setters and getters
}

第二个:

@Entity
@Table(name = "address")
public class Address implements Serializable{

    @OneToMany(mappedBy = "address")
    private List<Employee> employeeList;

    //setters and getters
}

因此,如果我想从数据库中读取Employee,我会读取address字段。 Address 具有带有 LazyInitializingException 的 employeeList但我不想知道employeeList。我只想知道employee.getAddress()。 我想发送 JSON 对象 Employee。但在客户端,由于 LazyInitializingException ,我无法加载资源:服务器响应状态为 500(内部服务器错误)

我可以使用:

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="myPersistenceUnit"/>
    <property name="packagesToScan" value="com.itechart.model"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <property name="showSql" value="false"/>
            <property name="generateDdl" value="true"/>
        </bean>
    </property>
    <!-- USE--!>
    <property name="jpaProperties">
        <props>
             <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
        </props>
    </property>
    <!-- END USE--!>
    <property name="persistenceProvider">
        <bean class="org.hibernate.jpa.HibernatePersistenceProvider"></bean>
    </property>
</bean>

最佳答案

您的 JSON 映射器可能会在 hibernate session 关闭后访问 Address.employeeList。这就是它发送 LazyInitializingException 的原因。

您可以尝试以下任一解决方案来解决该问题。

1 ) 从 JSON 映射中排除 employeeList

Jackson中,我们可以添加@JsonIgnore

@JsonIgnore
public List<Employee> getEmployeeList() {
}  

2 ) 在将 employeeList 发送到 JSON 映射器之前初始化它。

您可以通过调用employeeList.size()方法来实现

3)您可以将 fetchType 更改为 eager,如下所示

@OneToMany(mappedBy = "address", fetch = FetchType.EAGER) 
private List<Employee> employeeList;

关于java - Hibernate LazyInitializingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26502944/

相关文章:

java - 生成 1 到 99 之间的随机数?

java - 反射获取特定类中带注释的所有方法

java - 同步和 hibernate

ios - 必须使用延迟实例化的 UI View 将 subview 添加到 View Controller 两次

java - 安卓/Java : open a link in Chrome using a specific tab (not the last one)

java - 如何找到 8 拼图的所有可能状态?

java - 我可以从数据库中的 blob 加载 Spring contextConfigLocation 吗?

java - Spring JPA hibernate H2

ruby - 如何在 Ruby 中缓存方法结果

c# - 延迟实例化的传递参数