2016-09-26 4 views
0

Kann mir jemand sagen, was ich falsch mache? Ich habe die nächsten Tabellen:org.hibernate.exception.ConstraintViolationException: Spalte 'pacientId' kann nicht null sein

enter image description here

Und die Entitäten:

@Entity 
@NamedQuery(name = "Pacients.findAll", query = "SELECT p FROM Pacients p") 
public class Pacients implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int pacientId; 

    private String name; 

    private String surname; 

    // bi-directional many-to-one association to DetaliiPacient 
    @OneToOne(mappedBy = "pacient") 
    @Cascade(value = { CascadeType.ALL}) 
    private PacientsDetails pacientDetail; 

} 

@Entity 
@Table 
@NamedQuery(name = "PacientsDetails.findAll", query = "SELECT d FROM PacientsDetails d") 
public class PacientsDetails implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int pacientDetailsId; 

    private String address; 

    @OneToOne 
    @JoinColumn(name = "pacientId",referencedColumnName="pacientId") 
    @Cascade(value = { CascadeType.ALL}) 
    @JsonBackReference 
    private Pacients pacient; 
} 

Das Feld "pacientId" von "pacients" Tisch ist AUTO_INCREMENT und ich bin mit MySQL-Datenbank.

Der Fehler von Titel erscheint, wenn ich so mache:

sessionFactory.getCurrentSession().persist(pacient); 

In logs Ich sehe, dass Hibernate tut:

Hibernate: insert into Pacients (doctorId, name, surname) values (?, ?, ?) 
Hibernate: insert into PacientsDetails (address, pacientId) values (?, ?) 

aber das Problem ist die Tatsache, dass in der zweiten Abfrage der Der Wert von pacientId (der bei der ersten Abfrage neu generiert wurde) wird nicht erkannt.

Kann mir bitte jemand sagen, was ich vermisse? Vielen Dank im Voraus!

+0

allererst eines Patienten (Arzt Client) "Patient" geschrieben wird, nicht "pacient". 2 .: Könnten Sie bitte den Code posten, in dem Sie die beiden Entitäten speichern? – Alexander

+0

Vielen Dank für Ihre Antwort. Zuerst hatte ich die Entitäten in rumänischer Sprache und nachdem ich einen Refactor für die Verwendung von Englisch gemacht habe und ich vergessen die Entität "Pacient" :) sowieso aus technischer Sicht löste ich das Problem, wie ich unten beschrieben – Aditzu

Antwort

1

Ich nehme an, Sie Ihr Unternehmen wie folgt zu schaffen (ich weiß, dass die Felder privat sind, aber lassen Sie uns so tun, sind sie nicht)

pacient = new Pacients(); 
// set name & surname 
pacient.pacientDetail = new PacientsDetails(); 
// set address 

Wenn das der Fall ist, müssen Sie in der pacientsDetails das pacients Feld setzen als auch, weil pacientsDetails die Beziehung kartiert, nach Ihrem mappedBy

@OneToOne(mappedBy = "pacient") 

so sollte es so aussehen

pacient = new Pacients(); 
// set name & surname 
pacient.pacientDetail = new PacientsDetails(); 
// set address 
pacient.pacientDetail.pacient = pacient; 
+0

Meine Eingabe wird automatisch von einem json zugeordnet. Wie auch immer, ich habe deine Antwort als richtig markiert, weil du mich auf die richtige Spur gebracht hast. Ich hatte die Setter in der folgenden Art und Weise zu erstellen (indem auch die fild "pacient" von "pacientDetail" -Einstellung): \t public void setPacientDetail (PacientsDetails pacientDetail) { \t \t this.pacientDetail = pacientDetail; \t \t this.pacientDetail.setPacient (this); \t} – Aditzu

+0

Vielen Dank @SergeiBednar! – Aditzu

0

tun flush() nach bestehen bleiben()

sessionFactory.getCurrentSession().persist(patient); 
sessionFactory.getCurrentSession().flush(); 
... 
patientDetails.setPatientId(patient.getId()); 
... 
sessionFactory.getCurrentSession().persist(patientDetails); 
+0

Vielen Dank für Ihren Vorschlag, aber scheint meine Problem war was @SergeiBednar vorgeschlagen. – Aditzu

Verwandte Themen