19

나는 IDHOLIDAYPACKAGEHolidayPackageVariantHolidayPackage 사이 많은에 관계 법인 HolidayPackage을 말한다 테이블 HolidayPackageVariant에서 복합 기본 키 (IDHOLIDAYPACKAGE, IDHOLIDAYPACKAGEVARIANT) 있습니다.내 EmbeddedId가 최대 절전 모드로 작동하지 않는 이유는 무엇입니까?

내가 HolidayPackageVariant의 compund의 PK 매핑을 수행하려고, 나는 다음과 같은 오류 얻을 : 내가 잘못 여기에 무엇을

Initial SessionFactory creation failed.org.hibernate.annotations.common.AssertionFailure: Declaring class is not found in the inheritance state hierarchy: org.wah.model.holidaypackage.HolidayPackageVariantPrimaryKey

누군가가 말해 주시겠습니까 뭐하는 거지?

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 
} 
+0

안녕하세요 @brainydexter,이 질문에 대한 올바른 대답을 변경하시기 바랍니다. 나는 그것을 고쳐야 만했다. 그리고 다시 여기에 와서 대답을 게시하면 이미 거기 있다는 것을 깨달을 수있다. – coderatchet

+1

@coderatchet done. 그것을 지적 주셔서 감사합니다. 더 이상 최대 절전 모드를 사용하지 않아서 내 레이더에서 떨어졌습니다. – brainydexter

답변

77

클래스에는 @Id이 없어야합니다. HolidayPackageVariantPrimaryKey에서 Id 특수 효과를 제거하면 정상적으로 작동합니다.

+4

와 함께 작동하게하고 싶었습니다. 제 문제도 수정되었습니다. 나는 이것이 이전의 대답 대신에 답으로 표시되어야한다고 생각한다. – Jalpesh

+2

이게 옳은 대답 인 것 같습니다. –

+0

하지만 어떻게해야합니까? 멤버를 삽입 할 때마다'@ Embedded '멤버에서'private Long id;'멤버가 자동 값을 가져 오기를 원한다면? 이것은 [나는 지금 막 얻지 못하고있다] (http://stackoverflow.com/questions/29976363/hibernate-generatedvalue-in-embedded-always-null) ... – displayname

2

내가 @EmbeddedId 한 번 싸운 적, 나는 함께 같은 목표를 달성 완료했습니다

MY으로 POJO는 다음과 같이 @IdClass. 차이점은 @IdClass을 사용할 때 클래스 정의에서 사용하지 않지만 동일한 필드를 다시 선언한다는 것입니다 (그러나 나에게 더 편한 id 필드에 대해 getters/setter를 직접 지정했습니다).

복합 키 :

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

그것을 (군)을 사용하여 클래스 :

여기

프로젝트에서 내가 폴란드 정부 기관 GUS에서 자유롭게 사용할 주소 데이터베이스를 처리하는 데 사용, 내 예입니다
@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

클래스의 동일한 필드를 다시 정의해야하므로 IdClass를 사용해야하는 이유는 알지 못합니다. Embedded Id with – brainydexter

0

임베디드 클래스 인 복합 기본 키를 나타 내기 위해 엔티티 클래스 또는 매핑 된 수퍼 클래스의 영구 필드 또는 속성에 적용됩니다. 삽입 가능한 클래스는 삽입 가능으로 주석되어야합니다. EmbeddedId 주석을 사용할 때 하나의 EmbeddedId 주석과 Id 주석이 없어야합니다.

AttributeOverride 주석은 내장 가능 클래스에서 선언 된 열 매핑을 무시하는 데 사용할 수 있습니다.

MapsId 주석은 EmbeddedId 주석과 함께 사용하여 파생 기본 키를 지정할 수 있습니다.

엔티티에 파생 기본 키가있는 경우 AttributeOverride 주석은 상위 엔티티와의 관계에 해당하지 않는 내장 ID의 속성을 재정의하는 데만 사용할 수 있습니다.

관련 문제