Hibernate игнорирует «ленивый» тип выборки и сразу загружает свойства

Я использую Hibernate 5.2.5 (также используйте kotlin и весну 4.3.5, если это имеет значение), и я хочу, чтобы некоторые из полей моего класса загружались лениво. Но проблема в том, что все поля загружаются сразу, у меня нет специальных настроек Hibernate, и не используйте Hibernate.initialize ().

@Entity(name = "task") @Table(name = "tasks") @NamedQueries( NamedQuery(name = "task.findById", query = "SELECT t FROM task AS t WHERE t.id = :id") ) class Task { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Int? = null @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "author_id", nullable = false) lateinit var author: User @OneToOne(fetch = FetchType.LAZY, mappedBy = "task") var edit: TaskEdit? = null } 

Вот как я запрашиваю

TaskRepoImpl:

 override fun findById(id: Int): Task? { val task = getCurrentSession().createNamedQuery("task.findById", Task::class.java) .setParameter("id", id) .uniqueResult() return task } 

TaskService:

 @Transactional fun find(id: Int): Task? { return taskRepo.findById(id) } 

И выход:

 Hibernate: select task0_.id as id1_1_, task0_.author_id as author_i3_1_ from tasks task0_ where task0_.id=? Hibernate: select user0_.id as id1_3_0_, user0_.enabled as enabled2_3_0_, user0_.name as name3_3_0_, user0_.password as password4_3_0_ from users user0_ where user0_.id=? Hibernate: select taskedit0_.id as id1_0_0_, taskedit0_.task_id as task_id3_0_0_, taskedit0_.text as text2_0_0_ from task_edits taskedit0_ where taskedit0_.task_id=? 

Пожалуйста, советьте, что не так с моим кодом и как сделать свойства загрузки Hibernate лениво? Спасибо!

Hibernate не может проксировать свой собственный объект. Для этой проблемы существует как минимум три хорошо известных решения: простейшим является подделка отношений «один ко многим». Это будет работать, потому что ленивая загрузка коллекции намного проще, чем ленивая загрузка одного свойства с возможностью nullable, но в целом это решение очень неудобно, если вы используете сложные запросы JPQL / HQL. Другой способ – использовать битовое кодирование времени сборки. Для получения дополнительной информации, пожалуйста, ознакомьтесь с документом Hibernate: 19.1.7. Использование ленивой выборки свойств. Помните, что в этом случае вы должны добавить аннотацию @LazyToOne (LazyToOneOption.NO_PROXY) к отношениям один к одному, чтобы сделать ее ленивой. Устанавливать выбор для LAZY недостаточно. Последнее решение заключается в использовании инструментария байт-кода времени исполнения, но оно будет работать только для тех, кто использует Hibernate в качестве поставщика JPA в полномасштабной среде JEE (в таком случае установка hibernate.ejb.use_class_enhancer на true должна делать трюк: Конфигурация менеджера Entity Manager ) или используйте Hibernate с Spring, настроенный для выполнения плетения во время выполнения (этого может быть трудно достичь на некоторых старых серверах приложений). В этом случае также требуется аннотация @LazyToOne (LazyToOneOption.NO_PROXY).

  @Entity public class Animal implements FieldHandled { private Person owner; private FieldHandler fieldHandler; @OneToOne(fetch = FetchType.LAZY, optional = true, mappedBy = "animal") @LazyToOne(LazyToOneOption.NO_PROXY) public Person getOwner() { if (fieldHandler != null) { return (Person) fieldHandler.readObject(this, "owner", owner); } return owner; } public void setOwner(Person owner) { if (fieldHandler != null) { this.owner = fieldHandler.writeObject(this, "owner", this.owner, owner); return; } this.owner = owner; } public FieldHandler getFieldHandler() { return fieldHandler; } public void setFieldHandler(FieldHandler fieldHandler) { this.fieldHandler = fieldHandler; } } 

Можете ли вы попробовать это: http://justonjava.blogspot.in/2010/09/lazy-one-to-one-and-one-to-many.html

ссылка: почему Lazy loading не работает в одной ассоциации?