2013-08-23 42 views
5

Tôi cần sự trợ giúp của bạn để lập bản đồ mối quan hệ trong Hibernate của hai bảng sử dụng chú thích @ElementCollection bằng .JPA: cách sử dụng chú thích @ElementCollection?

Đầu tiên là bảng cha
Bảng tên: Chánh
DB Cột

KEY1   Char  (first primary key field) 
KEY2   Char  (second primary key field) 
DESCRIPTION Char 
DEPENDENTID BigInt 

Điều thứ hai là bảng phụ thuộc
TableName: phụ thuộc
DB Cột

PARENTID  BigInt (first primary key field) 
CODE   Char  (second primary key field) 
FIELD1  Char 
FIELD2  Char 

tôi cần phải xác định PK cho cả bảng sử dụng chú thích @EmbeddedId, vì vậy tôi đã tạo ra hai lớp:

@Embeddable 
public class ParentPK implements Serializable 
{ 
    @Column(name="K1") 
    private String iK1; 
    @Column(name="K2") 
    private String iK2; 
    // I omit the constructor, getter, setter, equals, hashcode method 
} 

@Embeddable 
public class DependentPK implements Serializable 
{ 
    @Column(name="PARENTID") 
    private String iParentId; 
    @Column(name="CODE") 
    private String iCode; 
    // I omit the constructor, getter, setter, equals, hashcode method 
} 

và sau đó tôi đã tạo hai đậu:
Lớp cho bảng THUỘC .
Lưu ý rằng trong lớp học này tôi không muốn có bất kỳ chú thích quan hệ

@Entity 
@Table(name = "DEPENDENT") 
public class DependentBean implements Serializable 
{ 
    @EmbeddedId 
    private DependentPK iDependentPK; 
    @Column(name = "FIELD1") 
    private String iField1; 
    @Column(name = "FIELD2") 
    private String iField2; 
    // I omit the constructor, getter, setter methods 
} 

Và lớp cho bảng PHỤ HUYNH

@Entity 
@Table(name = "PARENT") 
public class ParentBean implements Serializable 
{ 
    @EmbeddedId 
    ParentPK iParentPK; 
    @Column(name = "DESCRIPTION") 
    private String iDescription; 
    @Column(name = "DEPENDENTID") 
    private long iDependentId; 
    @ElementCollection 
    @CollectionTable(name="DEPENDENT", joinColumns={@JoinColumn(name="PARENTID", referencedColumnName="DEPENDENTID")}) 
    private Set<DependentBean> iDependentBeans = new HashSet<DependentBean>(); 
    // I omit the constructor, getter, setter methods 
} 

Khi tôi cố gắng triển khai tôi đã nhận lỗi:

Caused by: org.hibernate.MappingException: Foreign key (FK9619C2A17B05CB2:DEPENDENT [iDependentBeans_PARENTID,iDependentBeans_CODE])) must have same number of columns as the referenced primary key (DEPENDENT [PARENTID,iDependentBeans_PARENTID,iDependentBeans_CODE])

Vì vậy, tôi đang làm điều gì đó sai, nhưng tôi không thể tưởng tượng được điều gì. Có ai muốn giúp tôi không?

Trả lời

7

@ElementCollection nên được sử dụng với loại cơ bản hoặc lớp có thể nhúng, không phải cho thực thể.

DependentBean là một thực thể.

Cố gắng sử dụng một đến nhiều Mapping và sửa đổi giản đồ của bạn

schema PHỤ HUYNH

KEY1   Char  (PK) 
KEY2   Char  (PK) 
DEPENDENTID BigInt (PK) 
DESCRIPTION Char 

schema THUỘC

CODE   Char  (PK) 
PARENTID  BigInt (FK) 
KEY1   Char  (FK) 
KEY2   Char  (FK) 
FIELD1  Char 
FIELD2  Char 

Một Để Nhiều bản đồ

ParentPK

@Embeddable 
public class ParentPK { 
    @Column(name = "K1") 
    private String iK1; 
    @Column(name = "K2") 
    private String iK2; 
    @Column(name = "DEPENDENTID") 
    private long iDependentId; 
} 

ParentBean

@Entity 
@Table(name = "PARENT") 
public class ParentBean { 
    @EmbeddedId 
    ParentPK iParentPK; 

    @OneToMany(mappedBy = "parent") 
    List<DependentBean> iDependentBeans; 
} 

DependentBean

@Entity 
@Table(name = "DEPENDENT") 
public class DependentBean { 
    @Id 
    @Column(name = "CODE") 
    private String iCode; 

    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name = "PARENTID", referencedColumnName = "iDependentId"), 
     @JoinColumn(name = "K1", referencedColumnName = "iK1"), 
     @JoinColumn(name = "K2", referencedColumnName = "iK2") }) 
    ParentBean parent; 
} 
+0

Trước hết cảm ơn vì câu trả lời của bạn. Nhưng tôi đã thấy rằng sử dụng chú thích onetomany Hibernate tạo một kết nối khi được truy cập vào bảng cha. Tôi chỉ cần truy cập bảng phụ thuộc khi thuộc tính của nó được truy cập.Vì vậy, cách để làm điều này là gì? – gpezzini

+0

Tôi nghĩ rằng bạn sử dụng @OneToMany (fetch = FetchType.EAGER), điều này chắc chắn sẽ làm cho một tham gia như bạn nói. Hãy thử sử dụng @OneToMany (fetch = FetchType.LAZY) và đảm bảo rằng bạn truy cập vào thuộc tính trước khi kết thúc phiên. Nếu không, bạn sẽ nhận được một LazyInitializationException. – study

+0

Xin chào một lần nữa, nhưng có thể xác định OneToMany giữa hai bảng của tôi ** Phụ huynh ** và ** Phụ thuộc **? Như bạn thấy, bảng ** Phụ huynh ** có trường 'DEPENDENTID' có thể được liên kết với trường 'PARENTID' của bảng ** Phụ thuộc **. ** Bảng phụ thuộc ** có trường khóa chính khác: 'CODE'. Hai bảng có các khóa chính của riêng nó được mô tả bằng cách sử dụng lớp có thể nhúng. Vì vậy, theo ý kiến ​​của bạn, bạn có thể sử dụng chú thích @OneToMany trong trường hợp này? Tôi đã thử nhiều cách mà không thành công và tôi đã thử rất nhiều tìm kiếm mà không tìm thấy gì. Cảm ơn trước cho thời gian của bạn – gpezzini

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