У меня возникла проблема с двунаправленным сопоставлением между отношением «один ко многим», в результате чего многие не получают обновленный внешний ключ - он остается пустым при выполнении обновления/создания. Есть две сущности, первый (много) заключается в следующем:Dropwizard Hibernate 1.0.0
@Entity
@Table(name = "availability")
public class Availability implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PERSON_ID", nullable = false)
private Person person;
Второй является один:
@Entity
@Table(name = "PERSON")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "P")
public abstract class Person implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "person")
private Collection<Availability> availabilities;
Есть несколько вещей, которые могли бы быть причиной этого, но я неопределенными от истинной причины. Во-первых, человек является абстрактным. Однако тип наследования, который я использую, не должен вызывать эту проблему.
Второй способ, которым я пытаюсь сохранить объект в одной транзакции. Я использую @UnitOfWork от dropwizard. Мой DAO делает следующее:
public Staff update(Staff staff) {
return persist(staff);
}
Персонал в этой точке не имеет идентификатора. Наличие устанавливаются на человеке (также без идентификатора)
Под капотом, это просто вызвать следующее:
protected E persist(E entity) throws HibernateException {
currentSession().saveOrUpdate(requireNonNull(entity));
return entity;
}
Должен ли я использовать менеджер сеансов, чтобы открыть новую транзакцию, настоять человек, получить идентификатор назад, установите это на наличие и затем выполните обновление с человеком с измененной доступностью? Мне кажется, это было бы неправильно.