2016-11-06 3 views
0

대다수가 외래 키를 업데이트하지 않는 일대 다 관계 사이의 양방향 매핑에 문제가 있습니다. 업데이트/생성을 수행 할 때 null이 유지됩니다.Dropwizard Hibernate 1.0.0

@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; 

이 원인이 될 수있는 몇 가지가 있습니다,하지만 난 확신 해요 :

@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; 

두 번째는 하나입니다 : 두 가지 엔티티, 첫 번째 (많은)이되어 있습니다 진짜 이유가 무엇인지. 첫 번째는 사람이 추상적이라는 것입니다. 그러나 내가 사용하는 상속 유형이이 문제를 일으키지 않아야합니다.

두 번째 방법은 하나의 트랜잭션에서 엔티티를 유지하려고합니다. 나는 dropwizard의 @UnitOfWork를 사용하고 있습니다. 내 DAO는 다음을 수행하고 있습니다.

public Staff update(Staff staff) { 
    return persist(staff); 
} 

이 시점의 직원은 ID를 가지고 있지 않습니다. 가용성이 단순히 다음 호출, 후드에서

(또한 아이디없이) 사람에 설정됩니다

protected E persist(E entity) throws HibernateException { 
    currentSession().saveOrUpdate(requireNonNull(entity)); 
    return entity; 
} 

내가 새 트랜잭션을 열려면 세션 관리자를 사용하는 경우, 영속화 사람에게 얻을 이드 백, 가용성을 설정 한 다음 변경된 가용성을 가진 사람과 업데이트를 수행합니까? 그것은 나에게 잘못된 것처럼 보입니다.

답변

1

문제는 실제로 양방향 관계가 아니며 사람이 가용성에 설정되지 않았기 때문에 외래 키가 null 인 이유입니다.

단방향으로 수정했습니다.

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

및 Person.class

에서

Availability.class 다음에 I가 쌍방향 참조 즉 사람의 가치 기준을 분리 제거 하였다.

다른 변경 사항은 계단식 유형으로 트랜잭션 전략을 설정하는 것이 었습니다.

필드 주석 전략은 여기에서 문제가되지 않습니다.