2016-11-06 1 views
0

Ich habe ein Problem mit einer bidirektionalen Zuordnung zwischen einer Eins-zu-viele-Beziehung, wodurch die vielen nicht aktualisiert wird sein Fremdschlüssel - es bleibt null, wenn ein Update/erstellen. Es gibt zwei Einheiten, die erste (viele), ist dies: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; 

Es gibt ein paar Dinge, die dies verursacht werden könnte, aber ich bin unsicher:

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

Die zweite derjenige ist, von dem, was der wahre Grund ist. Die erste ist, dass Person abstrakt ist. Der Vererbungs-Typ, den ich verwende, sollte dieses Problem jedoch nicht verursachen.

Die zweite ist die Art und Weise, in der ich versuche, die Entität in einer einzigen Transaktion zu bestehen. Ich benutze @UnitOfWork von Dropwizard. Mein DAO macht folgendes:

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

Personal an diesem Punkt hat keine ID. Verfügbarkeit wird auf Person (auch ohne id)

Unter der Haube dies einfach ruft folgendes:

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

Sollte ich die Session-Manager werden mit einer neuen Transaktion zu öffnen, Person anhalten, die ID zurück, setze diese auf Verfügbarkeit und führe dann ein Update mit Person mit der geänderten Verfügbarkeit durch? Es scheint mir, dass es nur falsch wäre.

Antwort

1

Das Problem ist, dass es nicht wirklich eine bidirektionale Beziehung war, und Person wurde nie auf Verfügbarkeit eingestellt - daher war der Fremdschlüssel null.

Ich modifizierte es zu unidirektional.

Auf Person.class

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

und dann auf Availability.class entfernte ich die bidirektionale Referenz das heißt, die Person Referenzwert entfernt.

Die andere erforderliche Änderung war das Festlegen der Transaktionsstrategie mit dem Kaskadentyp.

Feldanmerkung Strategie ist nicht das Problem hier.