У меня есть два класса сущностей:
@Entity
@Table(name = "STAT_SETS")
public class StatisticSet extends ClientServerSharedObject {
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="statSet")
@MapKey(name = "name")
@MapKeyEnumerated(EnumType.STRING)
private Map<AbilityName, Ability> abilities = new EnumMap<>(AbilityName.class);
public StatisticSet(Race race) {
for (AbilityName abilityName : AbilityName.values()) {
abilities.put(abilityName, new Ability(abilityName, getModifier()));
}
}
}
@Entity
@Table(name = "ABILITIES")
public class Ability extends ClientServerSharedObject {
@ManyToOne
@JoinColumn(name = "STAT_SET_ID", nullable = false)
private StatisticSet statSet;
}
Я пытаюсь сохранить экземпляр StatisticSet
и получаю эту ошибку:
org.hibernate.PropertyValueException: not-null property references a null or transient value : org.package.Ability.statSet
Сейчас я использую Hibernate с Apache Derby в Java SE с транзакциями RESOURCE_LOCAL.Это работало нормально, когда я использовал его в контейнере Java EE с JTA.Hibernate знал, что нужно создать ссылку из Ability
, когда она была добавлена в список в StatisticSet
.
Почему это происходит?Это как-то связано с отсутствием JTA?persist()
происходит между begin()
и commit()
EntityTransaction.Могу ли я это исправить, или мне всегда придется вручную устанавливать ссылку в обоих направлениях в java SE примерно так:
abilities.put(abilityName, newAbility);
newAbility.setStatSet(this);