Hibernate игнорирует LAZY
на родительской стороне каждого двунаправленного взаимно-однозначного сопоставления, для которого установлено mappedBy
(или использует JoinColumn
и является необязательным), потому что ему нужно знать, когда инициализировать поле с нулевым значением или прокси.
Ваша проблема в том, что даже если вы используете MapsId
для дочернего элемента (Location
), родительский элемент по-прежнему использует mappedBy
.
Вот как вы может обеспечить ленивую загрузку двунаправленной ассоциации (хотя у нее есть свои недостатки, читайте до конца).
Родитель
@Entity
public class TestParent {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "id")
private TestChild child;
}
- * Поле 1020 * не является обязательным , оно немного хакерское, и вы можете просто проигнорировать его и при необходимости получить дочерний элемент, используя репозиторий - вы знаете, что это id
- Потому что это не стандартный родительский -to-child сопоставление, вы не можете указать какие-либо каскады в поле
child
(что будет отражать способ их сохранения, поэтому читайте до конца), иначе сохранение не удастся, потому что оно не сможет для присвоения идентификатора дочерней сущности. - * 103 0 * является обязательным , иначе он все равно будет загружен с нетерпением.
Ребенок
public class TestChild {
@Id
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@MapsId
@JoinColumn(name = "id")
private TestParent parent;
}
Так вы определили своего ребенка, ничего important было изменено.
Сохранение
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
TestParent parent = new TestParent();
TestChild child = new TestChild();
parent.setChild(child);
child.setParent(parent);
em.persist(parent);
em.persist(child);
em.getTransaction().commit();
em.close();
Поскольку родительский элемент больше не каскадно передает дочерний объект, вам необходимо сохранить дочерний элемент отдельно.
Подробнее .