2015-12-26 2 views
3

Проблема состоит в том, чтобы выбрать несколько родительских объектов и связать их с соответствующими дочерними элементами. Для такой задачи родители не должны загружаться вообще (например, только коллекция идентификаторов) или загружаться ленивыми полями.есть ли способ связать родителя с дочерним элементом без загрузки родителя в спящий режим?

  1. Есть ли API (обходные пути), чтобы связать 2 объекта по их идентификаторам? Например. без загрузки родителя и вызова setChild.
  2. Есть ли способ загрузить родителя со всеми ленивыми полями, даже если некоторые из них определены как нетерпеливые? Поскольку я искал, что hibernate поддерживает переопределение для типов загрузки. Например. можно записать Criteria, который загружает только выбранные поля. Но это не удобно, потому что новые классы сущностей могут быть добавлены с нетерпеливым типом.
  3. Могу ли я загрузить проекцию с одним и тем же ребенком, установить для него детей, а затем сохранить его как класс сущности?
+0

Session.load()/EntityManager.getReference(). –

+0

Не могли бы вы написать полный ответ с самораскрытым примером? – Cherry

ответ

2

Если у вас есть родительский идентификатор и ребенок имеет связь с родителем внешним ключом вы можете использовать поддельный родитель

Parent parent = new Parent(); 
parent.setId(parentId); 
child.setParent(parent); 
// save child 

Если вы хотите загрузить родитель с ленивыми полеми вы должны сделать все поля родителя ленивыми и получить их с помощью join fetch или загрузить по отдельным запросам. Если вы не будете использовать загруженный родитель для сохранения данных (например, вы можете построить нового родителя с тем же идентификатором после редактирования данных пользователя), вы можете использовать частичную загрузку объекта с помощью настраиваемого трансформатора, как описано here.

0

Надеюсь, это было бы полезно для вас.

Если вы сопоставили свои родительских и классов модели и аналогично в Hibernate Преобразования XML-файл таким образом, что без нагрузки родителя, дочерний объект может быть сохранен, то, безусловно, вы можете сделать вашу задачу.

Ниже приводится пример кода для вас: -

родительского класса (модель)

private Integer parentID; 
private String parentName; 
private Child childDetails; 

.. getters and setters .. 

Детский класс (модель)

private Integer childID; 
private String childName; 
private Parent parentDetails; 

.. getters and setters .. 

Hibernate Mapping File

<class name="Model.Parent" table="Parent"> 
    <id name="parentID" type="integer"> 
     <generator class="increment"></generator> 
    </id> 
    <property column="parentName" name="parentName" type="string"/> 
    <one-to-one class="Model.Child" name="childDetails" /> 
</class> 

<class name="Model.Child" table="Child"> 
    <id name="childID" type="integer"> 
     <generator class="increment"></generator> 
    </id> 
    <property column="childName" name="childName" type="string"/> 
    <many-to-one class="Model.Parent" column="parentID" name="parentDetails" unique="false" not-null="true" lazy="false"/> 
</class> 

как спасти ребенка без сохранения родителя

SessionFactory sf = HibernateUtil.getSessionFactory(); 
org.hibernate.Session ss = sf.openSession(); 
Transaction tx = ss.beginTransaction(); 
Parent p = new Parent(); 
Child c = new Child(); 
c.setChildName("XYZ"); 
c.setParentDetails(p); 
ss.save(c); 
tx.commit(); 
ss.close(); 
+0

Если вы сохраните дочерний элемент без сохранения, родитель выбросит исключение внешнего ключа, потому что дочерний элемент ссылается на родительскую строку inexistente. – IgniteCoders