2013-01-10 25 views
7

Tôi đang sử dụng chế độ ngủ đông và chú thích cho ORM. Tôi có giao diện cho tất cả các hạt và tôi đang sử dụng targetEntity cho các mối quan hệ: hibernate không thể lấy được loại vì getter trả về một giao diện chứ không phải là một bean.Ghi đè @ManyToOne targetEntity cho @Embedded với giao diện

Tôi nhận được một MappingException (không thể xác định loại) cho các hạt được nhúng.

@Entity(name="FieldBean") 
public class FieldBean implements Field { 
    ... 
} 

@Embeddable 
public class FacetBean implements Facet { 
    ...  

    @ManyToOne(targetEntity = FieldBean.class) 
    @JoinColumn(name = "field_id") 
    public Field getField() { 
     return field; 
    } 

} 

@Entity(name = "Chart") 
public class ChartBean implements Chart { 

    @Embedded 
    @AssociationOverride(
     name = "field", 
     joinColumns = @JoinColumn(name = "category_facet_field_id") 
    ) 
    public Facet getCategoryFacet() { 
     return categoryFacet; 
    } 

} 

tôi nhận được MappingException: Không thể xác định loại cho: Field, ở bảng: bảng xếp hạng, đối với các cột: [org.hibernate.mapping.Column (field)]

Sử dụng đậu thay vì giao diện cho tài sản và getter/setter khai báo giải quyết vấn đề, nhưng tôi muốn dính vào sử dụng giao diện. Chỉ sử dụng bean để khai báo tài sản không giải quyết được vấn đề.

Có ai có thể chỉ cho tôi đúng hướng không?

Trả lời

0

Quá khứ của tôi bằng cách sử dụng jpa nói với tôi không sử dụng thừa kế. Không có siêu lớp được ánh xạ, không có giao diện, v.v. chỉ đơn giản là các thực thể với các thành viên. tôi đã làm việc với hibernate cũng như eclipselink và cả hai đều thực sự có vấn đề với thừa kế. Rất khó để viết một lớp kiên trì với jpa hỗ trợ nhiều hơn một nhà cung cấp, vì có rất nhiều lỗi trong tất cả các nhà cung cấp này. giữ nó đơn giản nhất có thể. không sử dụng bất kỳ tính năng "đặc biệt" nào. Tôi đảm bảo với bạn, khi cố gắng thay đổi nhà cung cấp hoặc chỉ cần chạy phần mềm trên các máy chủ ứng dụng khác nhau như jboss (hibernate) hoặc glassfish/weblogic (nhật thực/liên kết trên cùng), bạn có thể vui mừng khi có một lớp kiên trì đơn giản nhất tính năng nhất có thể. Tôi không biết nếu đây là một lỗi, nhưng tôi giả sử nó là.

+0

Tôi đang sử dụng giao diện và thừa kế. Thừa nhận rằng điều này đã giới thiệu một số phức tạp ở cấp độ ORM. Mặt khác, nó cung cấp cho tôi mức độ trừu tượng mà tôi đang tìm kiếm. – user1966634

+0

** Giao diện ** được sử dụng để cung cấp sự trừu tượng của công nghệ ORM. Sử dụng cách tiếp cận MDA, tôi tạo ra mã lớp tồn tại trong một mô hình đối tượng, bao gồm các giao diện, các bean và các lớp dịch vụ. Một công nghệ ORM thay thế có thể được sử dụng một cách minh bạch bằng cách giữ cho các giao diện ổn định nhưng tạo ra các bean thay thế và các lớp dịch vụ. – user1966634

+0

** Thừa kế ** là cần thiết từ phối cảnh mô hình dữ liệu để hỗ trợ cả chế độ xem chung và cụ thể trên dữ liệu, cụ thể nhưng không chỉ ở cấp cơ sở dữ liệu quan hệ. Mặc dù có một số nhược điểm, tính năng này vẫn hữu ích và đơn giản hóa mã ở các cấp cao hơn trong ngăn xếp ứng dụng. – user1966634

1

Tôi đã sử dụng giải pháp khả thi cho điều này trong một thời gian, nhưng nó bao gồm một trường hợp nhỏ của khóa nhà cung cấp. Tôi đã không tìm thấy cách nào để làm điều này với chú thích JPA chỉ, nhưng có một chú thích Hibernate cụ thể @Target thực hiện thủ thuật đó. Tôi đã làm một cái gì đó như bạn có, với kết quả mong đợi. Tuy nhiên, tôi không sử dụng chú thích khác của bạn nên tôi không thể đảm bảo nó sẽ hoạt động như bạn mong đợi.

Không có gì lạ xảy ra trong lớp nhúng:

public interface PointsInt extends Serializable { 
    int offensivePoints(); 

    int defensivePoints(); 

} 

@Embeddable 
public class Points implements PointsInt { 
    private int def; 
    private int off; 
    public int offensivePoints() { return off; } 

    public int defensivePoints() { return def; } 

} 

Nhưng trong lớp tiêu thụ, chúng tôi sử dụng của Hibernate @Target:

import javax.persistence.*; 
import org.hibernate.annotations.Target; 

@Entity 
public class Series extends LongIdEntity implements Serializable { 

    @Embedded 
    @Target(Points.class) 
    private PointsInt points; 
    // I prefer to declare my annotations on fields rather than methods 
} 

Kết quả:

mysql> describe series; 
+-----------------+-------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+-----------------+-------------+------+-----+---------+----------------+ 
| id    | bigint(20) | NO | PRI | NULL | auto_increment | 
| def    | int(11)  | YES |  | NULL |    | 
| off    | int(11)  | YES |  | NULL |    | 
+-----------------+-------------+------+-----+---------+----------------+ 
3 rows in set (0.12 sec) 
Các vấn đề liên quan