如何避免在Hibernate中获取javassist延迟实体代理实例

Sky*_*ker 5 java xml spring hibernate

我有什么需要改变以避免Hibernate给我懒惰的javassist实例代理而不是真正的实体?

更新:我使用的是Spring 3.x和Hibernate 4.x.

我用来加载实体的API是org.hibernate.internal.SessionImpl#load(Person.class, Id)简单的映射:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.perfectjpattern.example.model">
<class name="Person" table="PERSON_" >
    <id name="id">
        <generator class="native"></generator>
    </id>
    <property name="name" update="false" />
    <property name="age" update="true" />
</class>

<query name="Person.findByName">
    <![CDATA[select p from Person p where p.name = ? ]]>
</query>

<query name="Person.findByAge">
    <![CDATA[select p from Person p where p.age = :Age ]]>
</query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

Rya*_*art 5

使用get()而不是load().


Sky*_*ker 0

实际上通过简单地将映射更改为(请参阅default-lazy="false")来解决它:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.perfectjpattern.example.model" default-lazy="false">
Run Code Online (Sandbox Code Playgroud)

  • 这是非常危险的,因为它将所有实体和集合设置为非惰性的,这意味着您可以轻松地将整个数据库意外加载到内存中。 (4认同)