Почему мой EmbeddedId в спящем режиме не работает? - PullRequest
20 голосов
/ 29 марта 2012

У меня есть составной первичный ключ (IDHOLIDAYPACKAGE, IDHOLIDAYPACKAGEVARIANT) в таблице HolidayPackageVariant, где IDHOLIDAYPACKAGE относится к сущности HolidayPackage с Многие до Один отношения между HolidayPackageVariant и HolidayPackage .

Когда я пытаюсь выполнить сопоставление PK Compund в HolidayPackageVariant, я получаю следующую ошибку:

InitialОшибка создания SessionFactory.org.hibernate.annotations.common.AssertionFailure: Объявление класса не найдено в иерархии состояний наследования: org.wah.model.holidaypackage.HolidayPackageVariantPrimaryKey

Может кто-нибудь сказать, кто яЯ что-то не так делаю?

МОИ POJO выглядят так:

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
}

HolidayPackage

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
}

Ответы [ 3 ]

82 голосов
/ 24 ноября 2012

Вы не должны иметь @Id в классе EmbeddedId.Удалите аннотацию Id в вашем HolidayPackageVariantPrimaryKey, и она должна работать нормально.

2 голосов
/ 29 марта 2012

Я однажды сражался с @EmbeddedId, и я достиг той же цели с @IdClass.Разница в том, что когда вы используете @IdClass, вы не используете его в определении класса, но вы переопределяете те же поля (однако у меня есть прямые методы получения / установки для полей идентификаторов, что для меня более удобно).

Вот мой пример из проекта, который я использую для обработки свободно доступной базы данных адресов польского государственного учреждения GUS:

Составной ключ:

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

Класс, использующий его (округ):

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

Класс, составляющий составной ключ (провинция):

@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;
    }
}
0 голосов
/ 22 февраля 2016

Применяется к постоянному полю или свойству класса сущности или сопоставленного суперкласса для обозначения составного первичного ключа, который является встраиваемым классом.Встраиваемый класс должен быть аннотирован как Embeddable.При использовании аннотации EmbeddedId должна быть только одна аннотация EmbeddedId и аннотация Id.

Аннотацию AttributeOverride можно использовать для переопределения сопоставлений столбцов, объявленных в классе embeddable.

Аннотация MapsIdможет использоваться вместе с аннотацией EmbeddedId для указания производного первичного ключа.

Если у объекта есть производный первичный ключ, аннотация AttributeOverride может использоваться только для переопределения тех атрибутов встроенного идентификатора, которые не соответствуютв отношении к родительской сущности.

...