JPA Verhindern von: attempted to assign id from null one-to-one property

lusitano

Aktives Mitglied
Hallo Leute.

Ich habe eine Abstrakte Klasse
Code:
public abstract class ReefTankAbstract {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "reefTankIDgenerator")
    @SequenceGenerator(name = "reefTankIDgenerator", sequenceName = "reefTankIDSequenz", allocationSize = 10, initialValue = 10)
    @Column(name = "reefTankid")
    private long id;
    }
von dieser erstelle ich mehrere konkrete Klassen. Zwei dieser konkreten Klassen beinhalten 1:1 Beziehungen zu den selben Klassen
Code:
public class ReefTankWithSump extends ReefTankAbstract {

    @OneToOne(mappedBy = "reefTankWithSump", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    private Sand sand;

    @OneToOne(mappedBy = "reefTankWithSump", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    private Rock rock;
und:
Code:
public class ReefTankOnlySandRocks extends ReefTankAbstract {

    @OneToOne(mappedBy = "reefTankOnlySandRocks", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    private Sand sand;

    @OneToOne(mappedBy = "reefTankOnlySandRocks", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    private Rock rock;
Beim erstellen des Objekts werden die ID s durch die setter an die andere Klasse übergeben.
Code:
sand.setReefTankOnlySandRocks(reefTank);
allerdings will die JPA auch die ID dem Objekt der Klasse zuweisen das nicht erstellt werden soll. Ergebnis ist der oben genannte Fehler. Wie kann ich das vermeiden / verhindern ?
 

lusitano

Aktives Mitglied
Ne. Denke nicht das es von der DB her kommt.
Setze ich die Variablen in die Abstrakte Klasse so funktioniert das Speichern ohne Probleme
Code:
    @OneToOne(mappedBy = "reefTankAbstract", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = true)
//    @Column(name = "reefSand")
    private Sand sand;

    @OneToOne(mappedBy = "reefTankAbstract", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = true)
//    @Column(name = "reefRock")
    private Rock rock;


Das mit Optinal könnte schon in die richtige Richtung sein. Aber wo genau ......
 

lusitano

Aktives Mitglied
Ich habe eine unidirektionale Beziehung daraus gemacht.
Hier hat es geklappt. Wie angegeben hat es die optionalen Felder ignoriert.
Warum er das in der bidirektionalen nicht macht. Das weiß de Geier.
Geh da später noch mal ran.
 

Ähnliche Java Themen

Neue Themen


Oben