with primary one many foreign data annotation java hibernate jpa hibernate-annotations composite-primary-key

java - primary - ¿Por qué mi EmbeddedId en hibernación no funciona?



spring entity composite key (3)

Aplicado a un campo o propiedad persistente de una clase de entidad o superclase asignada para denotar una clave primaria compuesta que es una clase integrable. La clase integrable debe anotarse como incrustable. Solo debe haber una anotación de EmbeddedId y ninguna anotación de Id cuando se utiliza la anotación de EmbeddedId.

La anotación AttributeOverride se puede usar para anular las asignaciones de columnas declaradas dentro de la clase incorporable.

La anotación MapsId se puede utilizar junto con la anotación EmbeddedId para especificar una clave primaria derivada.

Si la entidad tiene una clave primaria derivada, la anotación AttributeOverride solo se puede usar para anular aquellos atributos de la identificación incorporada que no corresponden a la relación con la entidad principal.

Tengo una clave principal compuesta (IDHOLIDAYPACKAGE, IDHOLIDAYPACKAGEVARIANT) en la tabla HolidayPackageVariant donde IDHOLIDAYPACKAGE refiere a la entidad HolidayPackage con una relación de muchos a uno entre HolidayPackageVariant y HolidayPackage .

Cuando intento realizar el mapeo PK de compund en HolidayPackageVariant, aparece el siguiente error:

Creación inicial de SessionFactory failed.org.hibernate.annotations.common.AssertionFailure: La declaración de clase no se encuentra en la jerarquía del estado de herencia: org.wah.model.holidaypackage.HolidayPackageVariantPrimaryKey

¿Puede alguien decirme qué estoy haciendo mal aquí?

MIS POJOS se ven así:

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 }

Paquete de vacaciones

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 }


He luchado una vez con @EmbeddedId , y he terminado de alcanzar el mismo objetivo con @IdClass . La diferencia es que cuando usas @IdClass , no lo usas en la definición de clase, pero vuelves a declarar los mismos campos (sin embargo, luego tengo receptores / configuradores directos para los campos de identificación, lo cual es más cómodo para mí).

Aquí está mi ejemplo, del proyecto que utilizo para procesar la base de datos de direcciones de libre acceso de la institución gubernamental polaca GUS:

La clave compuesta:

@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; } }

La clase que lo usa (condado):

@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; } }

La clase que compone la clave compuesta (provincia):

@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; } }


No debe tener el @Id en la clase EmbeddedId . Elimine la anotación de Id en su HolidayPackageVariantPrimaryKey y debería funcionar bien.