wake-up-neo.com

Warum funktioniert meine EmbeddedId im Ruhezustand nicht?

Ich habe einen zusammengesetzten Primärschlüssel (IDHOLIDAYPACKAGE, IDHOLIDAYPACKAGEVARIANT) in der Tabelle HolidayPackageVariant, wobei IDHOLIDAYPACKAGE auf die Entität HolidayPackage mit Many to One Beziehung zwischen HolidayPackageVariant und HolidayPackage .

Wenn ich versuche, die Compund-PK-Zuordnung in HolidayPackageVariant durchzuführen, wird die folgende Fehlermeldung angezeigt:

Anfängliche SessionFactory-Erstellung failed.org.hibernate.annotations.common.AssertionFailure: Die deklarierende Klasse wurde in der Vererbungsstatushierarchie nicht gefunden: org.wah.model.holidaypackage.HolidayPackageVariantPrimaryKey

Kann mir bitte jemand sagen, was ich hier falsch mache?

MEINE POJOs sehen so aus:

HolidayPackageVariant:

@Entity
@Table(name="HOLIDAYPACKAGEVARIANT")
public final class HolidayPackageVariant {

    private HolidayPackageVariantPrimaryKey idCompound;

    @EmbeddedId
    public HolidayPackageVariantPrimaryKey getIdCompound() {
        return idCompound;
    }

    // other code
}

HolidayPackageVariantPrimaryKey

@Embeddable
public final class HolidayPackageVariantPrimaryKey implements Serializable {

    private Integer idHolidayPackageVariant;
    private HolidayPackage holidayPackage;

    public HolidayPackageVariantPrimaryKey(){}

    public HolidayPackageVariantPrimaryKey(int id, HolidayPackage pkg){
        setIdHolidayPackageVariant(id);
        setHolidayPackage(pkg);
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "IDHOLIDAYPACKAGEVARIANT", nullable = false)
    public Integer getIdHolidayPackageVariant() {
        return idHolidayPackageVariant;
    }

    @Id
    @ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
    @JoinColumn(name="IDHOLIDAYPACKAGE", nullable=false)
    public HolidayPackage getHolidayPackage() {
        return holidayPackage;
    }

    // equals and hashCode
}

Urlaubspaket

public final class HolidayPackage {
    private Set<HolidayPackageVariant> holidayPackageVariants = new HashSet<HolidayPackageVariant>(0);

    @OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL}, mappedBy = "idCompound.holidayPackage")
    public Set<HolidayPackageVariant> getHolidayPackageVariants() {
        return holidayPackageVariants;
    }

    // other code
}
20
brainydexter

Sie sollten den @Id nicht in der EmbeddedId-Klasse haben. Entfernen Sie die Id-Annotation in Ihrer HolidayPackageVariantPrimaryKey und es sollte funktionieren. 

81
Kiran

Ich habe einmal mit @EmbeddedId gekämpft und mit @IdClass dasselbe Ziel erreicht. Der Unterschied ist, wenn Sie @IdClass verwenden, verwenden Sie es nicht in der Klassendefinition, sondern deklarieren die gleichen Felder erneut (allerdings habe ich dann direkte Getter/Setter für ID-Felder, was für mich komfortabler ist).

Hier ist mein Beispiel, aus einem Projekt, das ich verwende, um eine frei verfügbare Adressdatenbank der polnischen Regierungseinrichtung GUS zu verarbeiten:

Der zusammengesetzte Schlüssel:

@Embeddable
class GusPowiatPK implements Serializable {
    private static final long serialVersionUID = 1L;
    private Short powiatNr;
    private GusWojewodztwo wojewodztwo;

    @Column(name = "POW_NR")
    public Short getPowiatNr() {
        return powiatNr;
    }

    public void setPowiatNr(Short powiatNr) {
        this.powiatNr = powiatNr;
    }

    @ManyToOne
    @JoinColumn(name = "WOJ_ID")
    public GusWojewodztwo getWojewodztwo() {
        return wojewodztwo;
    }

    public void setWojewodztwo(GusWojewodztwo wojewodztwo) {
        this.wojewodztwo = wojewodztwo;
    }
}

Die Klasse, die es verwendet (County):

@Entity
@Table(name = "POWIAT")
@IdClass(GusPowiatPK.class)
public class GusPowiat {

    private Short powiatNr;
    private GusWojewodztwo wojewodztwo;
    private String nazwa;
    private Date stanNa;
    private boolean powiatMiejski;

    public GusPowiat() {
        super();
    }

    public GusPowiat(Short powiatNr, GusWojewodztwo wojewodztwo) {
        super();
        this.powiatNr = powiatNr;
        this.wojewodztwo = wojewodztwo;
    }

    @Id
    public Short getPowiatNr() {
        return powiatNr;
    }

    public void setPowiatNr(Short powiatNr) {
        this.powiatNr = powiatNr;
    }

    @Id
    public GusWojewodztwo getWojewodztwo() {
        return wojewodztwo;
    }

    public void setWojewodztwo(GusWojewodztwo wojewodztwo) {
        this.wojewodztwo = wojewodztwo;
    }

    @Column(name = "NAZWA", length = 50, nullable = false)
    public String getNazwa() {
        return nazwa;
    }

    public void setNazwa(String nazwa) {
        this.nazwa = nazwa;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "STAN_NA", nullable = false)
    public Date getStanNa() {
        return stanNa;
    }

    public void setStanNa(Date stanNa) {
        this.stanNa = stanNa;
    }

    @Column(name = "POW_MIEJSKI")
    public boolean isPowiatMiejski() {
        return powiatMiejski;
    }

    public void setPowiatMiejski(boolean powiatMiejski) {
        this.powiatMiejski = powiatMiejski;
    }
}

Die Klasse, aus der der zusammengesetzte Schlüssel (Provinz) besteht:

@Entity
@Table(name = "WOJEWODZTWO")
public class GusWojewodztwo {

    private Short id;
    private String nazwa;
    private Date stanNa;

    public GusWojewodztwo() {
        super();
    }

    public GusWojewodztwo(Short id) {
        super();
        this.id = id;
    }

    @Id
    @Column(name = "WOJ_ID")
    public Short getId() {
        return id;
    }

    public void setId(Short id) {
        this.id = id;
    }

    @Column(name = "NAZWA", length = 50, nullable = false)
    public String getNazwa() {
        return nazwa;
    }

    public void setNazwa(String nazwa) {
        this.nazwa = nazwa;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "STAN_NA", nullable = false)
    public Date getStanNa() {
        return stanNa;
    }

    public void setStanNa(Date stanNa) {
        this.stanNa = stanNa;
    }
}
2
Danubian Sailor

Wird auf ein persistentes Feld oder eine Eigenschaft einer Entitätsklasse oder einer zugeordneten Oberklasse angewendet, um einen zusammengesetzten Primärschlüssel anzugeben, der eine einbettbare Klasse ist. Die einbettbare Klasse muss als Embeddable annotiert werden. Es darf nur eine EmbeddedId-Annotation und keine Id-Annotation vorhanden sein, wenn die EmbeddedId-Annotation verwendet wird.

Die Annotation AttributeOverride kann verwendet werden, um die in der einbettbaren Klasse deklarierten Spaltenzuordnungen zu überschreiben.

Die MapsId-Annotation kann in Verbindung mit der EmbeddedId-Annotation verwendet werden, um einen abgeleiteten Primärschlüssel anzugeben.

Wenn die Entität über einen abgeleiteten Primärschlüssel verfügt, kann die Annotation AttributeOverride nur zum Überschreiben der Attribute der eingebetteten ID verwendet werden, die nicht der Beziehung zur übergeordneten Entität entsprechen.

0
Ajay