2017-03-22 2 views
0

Ich habe eine Berichtsentität, die mit einer Nummer (auto_increment) und einem Index identifiziert wird.Ich habe eine andere Einheit Flyleaf, die die gleiche Kennung hat, und es gibt eine Eins-zu-Eins-Zuordnung zwischen den beiden Entitäten ((Zahl, Index) ist ein Fremdschlüssel in der Vorsatztabelle). Mein Code ist:Composite ID nicht geändert nach Ruhezustand speichern

public class ReportPK implements Serializable { 

    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Basic(optional = false) 
    @Column(name="num") 
    private int num; 

    @Basic(optional = false) 
    @Column(name="report_index") 
    private String index; 
    ...(getters, setters, equals and hashCode) 
} 

@Entity 
@Table(name="report") 
public class Report { 

    @EmbeddedId 
    private ReportPK id; 

    @OneToOne(cascade=CascadeType.ALL) 
     @JoinColumns({ 
     @JoinColumn(name="num", referencedColumnName="num"), 
     @JoinColumn(name="report_index", referencedColumnName="report_index"), 
     }) 
    private Flyleaf flyleaf; 
    ... 
} 

@Entity 
@Table(name="flyleaf") 
public class Flyleaf implements Serializable{ 

    @EmbeddedId 
    private ReportPK id; 
    ... 
} 

Wenn ich einen Bericht speichern, ohne seine zugehörigen flyleaf Einstellung der Code funktioniert, und der Bericht zur Datenbank hinzugefügt wird. Wenn ich jedoch versuche, das Vorsatzblatt mit dem nächsten Code zu speichern, wird diese Ausnahme ausgelöst "com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (lgmi_cr. flyleaf, CONSTRAINT flyleaf_ibfk_1 FOREIGN KEY (num, report_index) LITERATUR report (num, report_index)).

Session session = getCurrentSession(); 
Report report = new Report(); 
ReportPK rpk = new ReportPK(); 
rpk.setIndex("A"); 
report.setId(rpk); 
session.save (report); 
//if I stop here the code works good and the num is auto_incremented in the data table 
Flyleaf flyleaf = new Flyleaf(); 
flyleaf.setId(report.getId()); 
report.setFlyleaf(flyleaf); 

fand ich heraus, dass der Grund dafür ist, dass nach dem Speichern des Berichts, dessen Nummer (num von ReportPK) nicht aktualisiert wird, und es ist gleich Null und sogar durch den nächsten Code ist die Nummer Null:

ReportPK pk = (ReportPK) session.save(report); 
pk.getNum(); 

Wenn einige mir helfen könnten und mir sagen, wo das Problem ist, werde ich dankbar sein.

Hinweis: Ich bin mit MySQL-Datenbank und Federrahmen

+0

Mögliches Duplikat von [So erhalten Sie den automatisch generierten Wert vom zusammengesetzten Primärschlüssel im Ruhezustand] (http://stackoverflow.com/questions/30592497/how-to-get-auto-generated-value-from-composite-primary -key-in-hibernate) – Naros

Antwort

0

erzeugten Werte sind nicht möglich mit @EmbeddedId zusammengesetzten Schlüsseln. Einbettbare Daten sind als Werte zugewiesen, daher wird die Verwendung von @GeneratedValue hier ignoriert.

+0

Vielen Dank für Ihre Antwort. In diesem Fall ist es meine Idee, die Annotation @GeneratedValue zu entfernen, das Feld num auto_incremened zu deaktivieren und der Tabelle ein Feld (let gen_field) hinzuzufügen, das auto_incrementiert ist (nicht Teil der primären ke). Wenn ich den Bericht speichern möchte, setze ich num auf 0 und indiziere auf A, dann werde ich den Wert von gen_field abrufen und die Nummer des Berichts mit diesem Wert aktualisieren. Ist das machbar? –

Verwandte Themen