Hibernate Mapping One To Many Relationship: PK родителя в FK ребенка

У меня есть классическая связь «один ко многим», и при сохранении ее с помощью Hibernate я не могу передать значение столбца PK родителя в столбец FK дочернего элемента.
Родительский класс

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int holdingPK;

@OneToMany(mappedBy="holding",targetEntity=PolicyType.class,fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@XmlElement(name = "Policy")
private Set<PolicyType> policy;

Дочерний класс

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int policyPK;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="HoldingFK",nullable = false)
private HoldingType holding;

Здесь HoldingPK — автоматически сгенерированный столбец последовательности, представляющий первичный ключ. Значение генерируется, когда я вставляю удерживающую строку. Поэтому я хочу передать значение HoldingPK в дочерний столбец HoldingFK на лету.
Проверочный код

HoldingType obj = new HoldingType();
obj.setCurrencyTypeCode("6");
obj.setHoldingKey("123");
Set<PolicyType> set = new TreeSet<PolicyType>();
PolicyType policy = new PolicyType();
policy.setJurisdiction("Haha");
set.add(policy);
obj.setPolicy(set);
session.save(obj);
transaction.commit();

Таким образом, я могу передать другие значения ребенка в столбец дочерней таблицы, просто родительский PK не достигает столбца FK ребенка.

Здесь я сохраняю значения XML-документа в базу данных. Для этого я упорядочиваю XML в объекты Java, используя JAXB, а затем сохраняю объекты, используя Hibernate. Таким образом, я повторно использую сгенерированные JAXB классы с Hibernate, и эти элементы PK и FK не существуют в XML. Они относятся к базе данных.


person Himanshu Yadav    schedule 12.07.2012    source источник
comment
Вы должны добавить больше информации о том, как вы создаете свои экземпляры объектов перед em.persist(). Hibernate должен позаботиться обо всем этом.   -  person nomoa    schedule 12.07.2012
comment
Как вы сохраняете родителя/ребенка? Я думаю, что использование mappedBy эквивалентно inverse=true в Hibernate, что означает, что Child является владельцем отношений, поэтому вам нужно сохранить дочерние элементы, чтобы правильно установить FK.   -  person jeff    schedule 12.07.2012
comment
@nomoa Я добавил тестовый код. Здесь все другие значения дочерних столбцов проходят идеально, только этот столбец FK заполняется родительским ПК.   -  person Himanshu Yadav    schedule 12.07.2012


Ответы (1)


Вы просто забыли инициализировать владеющую сторону двунаправленной ассоциации. Вы только инициализировали обратную сторону (та, которая имеет атрибут mappedBy). Hibernate считает, что сторона-владелец знает, существует ли ассоциация или нет (сторона без атрибута mappedBy).

Добавьте это в свой код (до сохранения владения):

policy.setHolding(obj);

Примечание: ваш код был бы намного более читабельным, если бы вы назвали поле policy (и средства доступа) policies. Их много, поэтому оно должно иметь форму множественного числа.

person JB Nizet    schedule 12.07.2012
comment
@Вы абсолютно правы. Это та часть, которую мне не хватает, чтобы получить идеальную объектную модель, но JAXB не знает об этом. Как это решить? - person Himanshu Yadav; 12.07.2012
comment
Вы можете установить родителя в вызывающем объекте afterunmarshall. см. jaxb.java.net/guide/Mapping_cyclo_references_to_XML.html - person user993553; 21.09.2015