19

Tôi có một hợp chất Primary Key (IDHOLIDAYPACKAGE, IDHOLIDAYPACKAGEVARIANT) trong bảng HolidayPackageVariant nơi IDHOLIDAYPACKAGE đề cập đến thực thể HolidayPackage với một Nhiều để Một mối quan hệ giữa HolidayPackageVariantHolidayPackage.Tại sao EmbeddedId của tôi ở chế độ ngủ đông không hoạt động?

Khi tôi cố gắng làm việc lập bản đồ PK compund trong HolidayPackageVariant, tôi nhận được lỗi sau:

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

Ai đó có thể xin vui lòng cho tôi biết những gì tôi làm sai ở đây?

POJO MY trông như thế này:

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

Xin chào @brainydexter, Bạn có thể vui lòng thay đổi câu trả lời đúng cho câu hỏi này không? Tôi phải sửa nó rồi quay lại đây và đăng câu trả lời chỉ để nhận ra nó đã ở đó rồi. – coderatchet

+1

@coderatchet đã hoàn tất. Cảm ơn đã chỉ ra điều đó. Không làm công cụ ngủ đông nữa nên điều này rơi khỏi radar của tôi. – brainydexter

Trả lời

77

Bạn không nên có @Id trong Lớp EmbeddedId. Xóa chú thích Id trong số HolidayPackageVariantPrimaryKey và chú thích của bạn sẽ hoạt động tốt.

+4

Điều này cố định vấn đề của tôi quá. Tôi nghĩ rằng điều này nên được đánh dấu là câu trả lời thay vì câu trả lời trước đó. – Jalpesh

+2

Có vẻ như đây là câu trả lời đúng –

+0

Nhưng tôi sẽ làm gì, ví dụ: nếu tôi muốn một thành viên 'riêng dài id;' trong '@ Embedded' của tôi để có được một giá trị tự động mỗi khi tôi chèn một phần tử? Đây là [những gì tôi không nhận được] (http://stackoverflow.com/questions/29976363/hibernate-generatedvalue-in-embedded-always-null) ... – displayname

2

Tôi đã chiến đấu một lần với @EmbeddedId, và tôi đã hoàn thành việc đạt được cùng một mục tiêu với @IdClass. Sự khác biệt là, khi bạn sử dụng @IdClass, bạn không sử dụng nó trong định nghĩa lớp, nhưng bạn redeclare các lĩnh vực tương tự (tuy nhiên, tôi có sau đó trực tiếp getters/setters cho các lĩnh vực id, đó là thoải mái hơn cho tôi).

Dưới đây là ví dụ của tôi, từ dự án tôi sử dụng để xử lý cơ sở dữ liệu địa chỉ cung cấp miễn phí từ Ba Lan tổ chức chính phủ GUS:

Mấu chốt hợp:

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

Lớp sử dụng nó (hạt):

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

Khóa soạn thảo lớp học (tỉnh):

@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

Tôi không hiểu vì sao nên sử dụng IdClass vì tôi cần phải xác định lại các trường giống nhau trong lớp. Tôi đã hy vọng để làm cho nó làm việc với EmbeddedId – brainydexter

0

Áp dụng cho trường hoặc thuộc tính liên tục của lớp tổ chức hoặc lớp phủ được ánh xạ để biểu thị khóa chính kết hợp là lớp có thể nhúng. Lớp có thể nhúng phải được chú thích là Có thể nhúng. Chỉ phải có một chú thích EmbeddedId và không có chú thích Id khi chú thích EmbeddedId được sử dụng.

Chú thích AttributeOverride có thể được sử dụng để ghi đè ánh xạ cột được khai báo trong lớp nhúng.

Chú thích MapsId có thể được sử dụng cùng với chú thích EmbeddedId để chỉ định khóa chính có nguồn gốc.

Nếu thực thể có khóa chính có nguồn gốc, chú thích AttributeOverride chỉ có thể được sử dụng để ghi đè các thuộc tính của id được nhúng không tương ứng với mối quan hệ với thực thể cha.

Các vấn đề liên quan