2012-12-24 11 views
5

Co muszę zmienić, aby uniknąć Hibernate dając mi leniwych instancji proxy javassist zamiast prawdziwej jednostki?jak uniknąć leniwego javassist Entity proxy in Hibernate

UPDATE: Używam Wiosna i Hibernacja 3.x 4.x

API używam załadować podmiot jest org.hibernate.internal.SessionImpl#load(Person.class, Id) i mapowanie po prostu:

<?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> 
+2

Używaj raczej chętnego niż leniwego ładowania. –

+0

Mogę sobie wyobrazić, ale co dokładnie i gdzie należy skonfigurować, to jest OP –

+0

Jeśli pokażesz nam jedną ze swoich zmapowanych jednostek, możemy Ci pomóc. –

Odpowiedz

0

Właściwie rozwiązany poprzez zmianę odwzorowanie (patrz 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"> 
+4

Jest to dość niebezpieczne, ponieważ ustawia wszystkie elementy i kolekcje, aby nie były leniwe, co oznacza, że ​​można łatwo załadować całą bazę danych do pamięci przez przypadek. –

+0

Dziękuję za wyjaśnienie, jednak, jak można zauważyć w PO, mam jedną tylko jednostkę zdefiniowaną w moim mapowaniu. W moim przypadku użycia również 'load' tylko jeden element (według Id). Jeśli utrzymam większy projekt, każda jednostka będzie miała swój własny plik odwzorowania, w którym będę mógł zdecydować, jaka powinna być polityka ładowania. Istnieje również druga strona medalu, w której dla różnych przypadków użycia muszę wywołać 'load' lub' get', nie jest to dobre z punktu widzenia reutyability kodu. –

5

Zastosowanie get() zamiast load() .

+0

+1 za dodatkowy szczegół, ale myślę, że 'load' byłby bardziej elastyczny, ponieważ w innych przypadkach mogę wybrać leniwy ładunek. Mogę w ten sposób skonfigurować go dla każdej jednostki osobno. –

+0

Twoje zgłoszenie powinno wybierać, kiedy przynosić rzeczy chętnie, a kiedy nie. To znaczy. użyj get(), kiedy musisz i załaduj() w dowolnym innym momencie. –

+0

Należy jednak pamiętać, że jeśli aplikacja naprawdę musi być tego świadoma, prawie na pewno robi się coś złego. Leniwe ładowanie ma być przezroczyste. –

1

Można użyć Hibernate.initialize(obj) po session.load(id).

Ta metoda natychmiast inicjuje twój obiekt.

+0

... która jest w zasadzie bardziej skomplikowaną i wolniejszą wersją [using session.get()] (http://stackoverflow.com/a/14024110/839646). –

+0

można zainicjować swój obiekt, gdy jest to wymagane, a nie zainicjować go zawsze. – ivivi

Powiązane problemy