По умолчанию все ассоциации one-to-many
и many-to-many
выбираются лениво при первом доступе.
В вашем случае использования вы могли бы преодолеть эту проблему, обернув все операции DAO в одну логическую транзакцию:
transactionTemplate.execute(new TransactionCallback<Void>() {
@Override
public Void doInTransaction(TransactionStatus transactionStatus) {
int startingCount = sfdao.count();
sfdao.create( sf );
SecurityFiling sf2 = sfdao.read( sf.getId() );
sfdao.delete( sf );
int endingCount = sfdao.count();
assertTrue( startingCount == endingCount );
assertTrue( sf.getId().longValue() == sf2.getId().longValue() );
assertTrue( sf.getSfSubmissionType().equals( sf2.getSfSubmissionType() ) );
assertTrue( sf.getSfTransactionNumber().equals( sf2.getSfTransactionNumber() ) );
return null;
}
});
Другой вариант - получить все ассоциации LAZY при загрузке вашей сущности, так что:
SecurityFiling sf2 = sfdao.read( sf.getId() );
должен получить LAZY submissionType
тоже:
select sf
from SecurityFiling sf
left join fetch.sf.submissionType
Таким образом, вы охотно получаете все ленивые свойства и можете получить к ним доступ после закрытия сессии.
Вы можете получить столько [one|many]-to-one
ассоциаций и одну "[one | many]-to-many" ассоциацию списка (из-за запуска декартового произведения).
Чтобы инициализировать несколько «[один | много]-ко-многим», вы должны использовать Hibernate.initialize (collection) , сразу после загрузки вашей корневой сущности.