2016-11-06 6 views
0

У меня возникла проблема с двунаправленным сопоставлением между отношением «один ко многим», в результате чего многие не получают обновленный внешний ключ - он остается пустым при выполнении обновления/создания. Есть две сущности, первый (много) заключается в следующем: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; 
} 

Должен ли я использовать менеджер сеансов, чтобы открыть новую транзакцию, настоять человек, получить идентификатор назад, установите это на наличие и затем выполните обновление с человеком с измененной доступностью? Мне кажется, это было бы неправильно.

ответ

1

Проблема в том, что на самом деле это не было двунаправленным отношением, и Person никогда не устанавливался на доступность - следовательно, внешний ключ был пустым.

Я изменил его на однонаправленный.

На Person.class

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name = "person_availability") 
private List<Availability> availabilities; 

, а затем на Availability.class я удалил двунаправленное опорный т.е. удаляется ссылка лицо значение.

Другим необходимым изменениям была настройка транзакционной стратегии с каскадным типом.

Стратегия полевой аннотации здесь не является проблемой.

Смежные вопросы