2009-05-27 6 views
7

Tôi có một đối tượng với một trường có thể là một số loại đối tượng. Đối tượng này được mã hóa trong một bảng đơn với cột phân biệt đối xử cho các kiểu con của trường. Mỗi loại phụ này có các trường được ánh xạ tới một cột trong bảng đối tượng cha. Tôi không thể có vẻ để mô hình này trong hibernate. Mã dưới đây sẽ trả lại giá trị rỗng cho getSubfield() bất kể dữ liệu loại phụ nằm trong bảng.Hibernate Embeddable Inheritance

Schema

 
    id type whosit whatsit 
+----+------+--------+---------+ 
| 1 | "A" | "test" | null | 
| 2 | "B" | null | "test" | 
+----+------+--------+---------+ 

miền Objects

@Entity 
public class Parent { 
    protected @Id @GeneratedValue int id; 
    protected Subfield subfield; 

    public Subfield getSubfield() {return subfield;} 
} 


@Embeddable 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING) 
public abstract class Subfield {} 


@DiscriminatorValue("A") 
public class TypeA extends Subfield { 
    public String whosit; 
} 


@DiscriminatorValue("B") 
public class TypeB extends Subfield { 
    public String whatsit; 
} 

"SELECT p TỪ mẹ p"

{id=1,subfield=null} 
{id=2,subfield=null} 

Có possib Để hoàn thành những gì tôi muốn với mô hình đối tượng này hoặc tôi cần phải sáng tạo hơn một chút (đây là cơ sở dữ liệu kế thừa, thay đổi giản đồ không được ưu tiên)

+1

Một đồng nghiệp tại nơi làm việc đã chỉ cho tôi http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910. Tôi đoán nó không được hỗ trợ = \ –

Trả lời

3

Ok bạn không thể dễ dàng thay đổi lược đồ, nhưng làm thế nào về việc thêm một vài quan điểm?

+1

Ý tưởng hay, thật không may, nó vẫn là một sửa đổi cấu trúc cơ sở dữ liệu. Tôi đang cố gắng giải quyết vấn đề này bằng mã, nếu không có gì khác, nó có vẻ như thứ gì đó mà ngủ đông có thể làm và tôi tò mò về những gì tôi đang làm sai. –

+1

+1 để bình luận của bạn và nhắc nhở SO rằng đôi khi, chúng ta không thể "làm cho nó đúng" và sửa chữa thiết kế lược đồ xấu. :-) – cbmeeks

5

Theo chỉ định của người hỏi, hibernate không hỗ trợ kế thừa các lớp có thể nhúng (https://hibernate.atlassian.net/browse/HHH-1910).

Theo wiki Eclipse, JPA không chỉ định hành vi này, nhưng EclipseLink hỗ trợ nó (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance).

Đề xuất của tôi là đập vỡ lớp học hoàn toàn bên trong Trường con. Khủng khiếp, nhưng nên làm việc cho đến khi điều này được giải quyết.

1

Tôi biết điều này là cũ.

Một cách xung quanh vấn đề này như được chỉ định ở trên. Tạo chế độ xem. Bạn nói rằng bạn không muốn thay đổi lược đồ. Vậy thì đừng. Bạn có thể tạo một lược đồ mới để ánh xạ lược đồ cũ và thực hiện những gì bạn muốn. (Có thể tùy thuộc vào cơ sở dữ liệu)