Frage

Ich habe eine allgemeine Frage zu Hibernate, mit der ich kämpfe.

Ich habe Klasse A und Klasse B, wobei B von A abhängig ist

In meinem Code, wenn ich sie anrufe.persistent (objOfTypeA) Ich würde erwarten, dass die Einfügung in beide Tabellen AAA und BBB eingefügt wird.Wenn ich manuell die ID von get A vorschreibe und sie für jedes Objekt in die Liste einfüge und diese Liste dann behalte, funktionieren die Dinge.Aber ich würde erwarten, dass das passiert magisch von Hibernate.

Mache ich etwas falsch?Oder erwarte ich einfach zu viel von Hibernate?

Danke

@Entity
@Table(name = "AAA")
@Veto
public class A {

    @Id
    @GeneratedValue
    @Column(name = "Id")
    private Long id;


    @NotNull
    @Column(name = "Name")
    private Long name;

    ...

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
    private List<B> b;
...
}

@Entity
@Table(name = "BBB")
@Veto
public class B {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long id;

    @NotNull
    @Column(name="AId")
    private Long aId;

    @NotNull
    @Column(name = "Name")
    private Long name;

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false)
    @ManyToOne(optional = false)
    private A a;
...     
}
War es hilfreich?

Lösung

Ich habe es endlich herausgearbeitet. Keiner der Beispiele, die ich gegeben habe oder gefunden wurde, sagte mir genau, was falsch war, es war erst nach meinem eigenen Experimentier, dass es mir geschafft, zu diesem Schluss zu kommen:

Anstatt zu haben generasacodicetagpre.

das funktionierte nicht (fk kam immer noch als null)

Das hat funktioniert: generasacodicetagpre.

Andere Tipps

Ändern Sie die Zuordnung der Klasse B wie unten,

@Entity
@Table(name = "BBB")
@Veto
public class B {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long id;

    @NotNull
    @Column(name="AId", updatable = false, insertable = false)
    private Long aId;

    @NotNull
    @Column(name = "Name")
    private Long name;

    @JoinColumn(name = "AId", referencedColumnName="Id")
    @ManyToOne(optional = false)
    private A a;
...     
}

Sie haben die Attribute verwendet updatable = false, insertable = false am falschen Ort und ich habe es korrigiert.

Lesen hier um zu verstehen, wie sie funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top