2012-04-09 41 views
11

Tôi đang sử dụng eclipselink cho JPA. Tôi có một thực thể có khóa tổng hợp được chế tạo từ hai trường. Sau đây là các trường Có thể nhúng của lớp chính (thành viên) của tôi.Ánh xạ khóa ngoài bên trong lớp có thể nhúng

@Embeddable 
    public class LeavePK { 
     @ManyToOne(optional = false) 
     @JoinColumn(name = "staffId", nullable = false) 
     private Staff staff; 
     @Temporal(TemporalType.TIMESTAMP) 
     private Calendar date; 
     //setters and getters 
    } 

Thực thể của tôi sẽ lưu giữ dữ liệu liên quan đến nhân viên, vì vậy tôi đang cố gắng kết hợp đối tượng nhân viên và để ngày tạo khóa tổng hợp. Ngoài logic của tôi, nó không cho phép tôi có một ánh xạ khóa ngoài trong lớp nhúng được. Khi tôi cố gắng sử dụng các công cụ JPA -> Tạo bảng từ thực thể, nó cho lỗi như dưới đây, điều này giải thích, nhưng tôi không nhận được nó.

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The mapping [staff] from the embedded ID class [class rs.stapp.entity.LeavePK] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [leavePK] from the source [class rs.stapp.entity.Leave]) can only contain basic mappings. Either remove the non basic mapping or change the embedded ID specification on the source to be embedded. 

Có nghĩa là, tôi không thể có khóa (từ khóa tổng hợp) cũng là khóa ngoại. Có cách nào khác để thực hiện ERM này không? Hãy giúp tôi. Cảm ơn

Trả lời

12

Không đặt mối quan hệ vào các lớp ID, không cho các mối quan hệ @IdClass hoặc @EmbeddedId. Lớp học @Embeddable chỉ có thể bao gồm chú thích @Basic, @Column, @Temporal, @Enumerated, @Lob hoặc @Embedded. Mọi thứ khác là cú pháp của nhà cung cấp cụ thể (ví dụ: Hibernate cho phép điều này, nhưng vì bạn đang sử dụng EclipseLink, đó là JPA RI, tôi nghi ngờ đây là những gì bạn muốn).

Dưới đây là một ví dụ JPA PK/FK lập bản đồ:

@Entity 
@Table(name = "Zips") 
public class Zip implements Serializable 
{ 
    @EmbeddedId 
    private ZipId embeddedId; 

    @ManyToOne 
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code") 
    private Country country = null; 

    ... 
} 

@Embeddable 
public class ZipId implements Serializable 
{ 
    @Column(name = "country_code") 
    private String countryCode; 

    @Column(name = "code") 
    private String code; 

    ... 
} 

HTH

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