Предполагая, что предусмотрены следующие отображения:Можно ли использовать внешний ключ без привязки объекта к объекту?
<class name="A" table="a_table">
<id name="id"/>
<many-to-one name="entityB" column="fk_B" not-null="false" unique="true"/>
</class>
<class name="B" table="b_table">
<id name="id"/>
</class>
Java класс:
public class A {
private long id;
private B entityB;
// getters and setters skipped
}
Можно ли изменить отображение гибернации, так что внешний ключ все еще применяются и созданные Hibernate при запуске, но класс A
будет выглядеть следующим образом:
public class A {
private long id;
private long idOfB;
// getters and setters skipped
}
Я понимаю, что если бы я конвертировал <many-to-one...
в <property...
, это сработало бы, но внешний ключ не будет применяться в базе данных.
мне нужно сделать это, потому что объект B
мощь (или не может) быть инициализирован отдельно, что иногда приводит к org.hibernate.LazyInitializationException: could not initialize proxy - no Session
исключения возникают, когда a.getB()
называется. Я бы предпочел иметь его как long idOfB
и загружать весь объект, когда это необходимо; это также ускорит загрузку объекта A
.
Я считаю, что мой вопрос очень похож на this one, но предложенное решение (использовать отложенную загрузку) не подходит в моем случае, так как даже если я называю a.getB().getId()
, я бы получить LazyInitializationException
тогда, если я называю a.getIdOfB()
я Wouldn» т.
Большое спасибо за внимание.
Настоятельно рекомендую использовать LazyLoading, а не изобретать колесо. Вы получили бы типы безопасных классов объектов, точно такую же производительность и могли бы покончить с пользовательским кодом перезагрузки. Обратите внимание, что LazyLoading приводит к тому, что LazyLoadingException используется неправильно, то есть если запрошенная ленивая загрузка запрашивается после закрытия сеанса. Также обратите внимание, что запрос идентификатора объекта не приводит к загрузке объекта. Я рекомендую вам задать вопрос с конкретными проблемами, которые возникают с LazyLoading. – meriton
Поверьте, я использую LazyLoading. Это всего лишь один случай из сотен, где я не могу. В противном случае я не стал бы спрашивать. – mindas
Связанный вопрос: [java - Hibernate - внешние ключи вместо сущностей] (http://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-ofentities). –