2009-06-04 29 views
10

Tôi đang cố ánh xạ một đối tượng @Embeddable trong một phân lớp có lớp cha đã có một trường của loại @Embeddable đó.Hibernate ánh xạ trường @Embeddable thứ hai trong một lớp con

Hibernate Embeddable Objects documentation tuyên bố tôi có thể sử dụng @AttributeOverrides để ghi đè lên các tên cột của một đối tượng @Embeddable:

ví dụ

@Entity 
public class Person implements Serializable { 

    // Persistent component using defaults 
    Address homeAddress; 

    @Embedded 
    @AttributeOverrides({ 
      @AttributeOverride(name="iso2", column = @Column(name="bornIso2")), 
      @AttributeOverride(name="name", column = @Column(name="bornCountryName")) 
    }) 
    Country bornIn; 
    ... 
} 

Đây là trường hợp tôi có:

@Embeddable 
    public class ContentID implements Serializable { 
     @Column(name="contentID") 
     private String contentPath; 
    } 

    @MappedSuperclass 
    public abstract class BaseDomainObject implements Serializable { 

     @Embedded 
     private ContentID contentID; 
    } 

public class Achievement extends BaseDomainObject { 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name="contentID", column = @Column(name="awardedItem")), 
    }) 
    private ContentID awardedItem; 
} 

Các lỗi tôi nhận được là:

org.hibernate.MappingException: Lặp đi lặp lại cột trong bản đồ cho tổ chức: cột Thành tích: contentID (nên được ánh xạ với insert = "false" update = "false") tại org.hibernate.mapping.PersistentC lass.checkColumnDuplication (PersistentClass.java:652) tại org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:674) tại org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:670) tại org.hibernate.mapping.PersistentClass.checkColumnDuplication (PersistentClass.java:696) tại org.hibernate.mapping.PersistentClass.validate (PersistentClass.java:450) tại org.hibernate.mapping.SingleTableSubclass.validate (SingleTableSubclass .java: 43) tại org.hibernate.cfg.Configuration.validate (Configuration.java:1108) tại org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1293) tại org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory (AnnotationConfiguration.java:867)

UPDATE:

Tôi đã xem xét các vấn đề Hibernate liên quan đến vấn đề này và dự án GRAILS tuyên bố họ đã khắc phục sự cố này nhưng giải pháp chú thích của họ dường như không phải là chú thích javax.persistence hợp lệ (có thể đó là phiên bản mới).

JPA @Embeddable/@Embedded throws org.hibernate.MappingException: Repeated column in mapping for entity

+0

Ngoài sự tò mò: Tại sao bạn nhúng quốc gia thay vì sử dụng mối quan hệ? –

Trả lời

7

Vấn đề có vẻ là điều này:

public class ContentID implements Serializable { 
    @Column(name="contentID") 
    private String contentPath; 
} 

Bạn đang làm cho tên cột contentPath là "contentId" và đó là đụng độ với chú thích AttributeOverride của bạn sau này.

Hãy thử điều này:

public class ContentID implements Serializable { 
    @Column(name="contentPath") 
    private String contentPath; 
} 

CẬP NHẬT Tôi cũng băn khoăn về vấn đề này:

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="contentID", column = @Column(name="awardedItem")), 
}) 
private ContentID awardedItem; 

Bạn dường như được thay đổi tên của cột contentId đây để awardedItem. Điều đó có thực sự cần thiết không?

+0

Sự cố không được gây ra bởi @AttributeOverride trong Thành tích, nhưng vì ID nội dung @Embedded có trong lớp cơ sở của lớp thành công BaseDomainObject. Sự cố trong ánh xạ ngủ đông kế thừa khiến đối tượng có 2 đối tượng ContentID được nhúng dưới dạng cột contentID mà tôi nghĩ AttributeOverride sẽ xử lý nó. Ngay cả khi tôi đã xóa @Column (name = "contentID"), tôi nghĩ vấn đề sẽ vẫn còn. – Dougnukem

1

Tôi đang sử dụng

@JoinColumn(insertable=false, updatable=false) 

như một cách giải quyết.

2

Vincent đúng. Trường Tên attributeOverride đề cập đến tên cột khi nó phải là một thuộc tính/thuộc tính của một lớp.

@AttributeOverrides({ 
    @AttributeOverride(name="contentPath", column = @Column(name="awardedItem")), 
}) 

Lưu ý rằng tên cho thuộc tính lớp không phải là cột cơ sở dữ liệu.

Xem documentation

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