2010-05-09 41 views
11

Tôi đang sử dụng chú thích Hibernate và tôi tự hỏi liệu điều sau có thể thực hiện được hay không.Java/Hibernate sử dụng giao diện trên các đối tượng

Tôi phải thiết lập một loạt các giao diện đại diện cho các đối tượng có thể tiếp tục tồn tại và một giao diện cho lớp cơ sở dữ liệu chính chứa một số hoạt động để duy trì các đối tượng này (... API cho cơ sở dữ liệu).

Dưới đây, tôi phải triển khai các giao diện này và lưu giữ chúng với Hibernate.

Vì vậy, tôi sẽ phải, ví dụ:

public interface Data { 
    public String getSomeString(); 
    public void setSomeString(String someString); 
} 

@Entity 
public class HbnData implements Data, Serializable { 
    @Column(name = "some_string") 
    private String someString; 

    public String getSomeString() { 
    return this.someString; 
    } 
    public void setSomeString(String someString) { 
    this.someString = someString; 
    } 
} 

Bây giờ, điều này hoạt động tốt, loại. Sự cố xảy ra khi tôi muốn các thực thể lồng nhau. Giao diện của những gì tôi muốn là dễ dàng đủ:

public interface HasData { 
    public Data getSomeData(); 
    public void setSomeData(Data someData); 
} 

Nhưng khi tôi thực hiện các lớp học, tôi có thể làm theo giao diện, như dưới đây, và nhận được một lỗi từ Hibernate nói nó không biết lớp "Dữ liệu".

@Entity 
public class HbnHasData implements HasData, Serializable { 
    @OneToOne(cascade = CascadeType.ALL) 
    private Data someData; 

    public Data getSomeData() { 
    return this.someData; 
    } 

    public void setSomeData(Data someData) { 
    this.someData = someData; 
    } 
} 

Thay đổi đơn giản là thay đổi loại từ "Dữ liệu" sang "HbnData", nhưng rõ ràng là sẽ phá vỡ triển khai giao diện và do đó không thể trừu tượng hóa được.

Có ai có thể giải thích cho tôi cách thực hiện điều này theo cách nó sẽ hoạt động với Hibernate không?

+2

Và điểm của việc sử dụng các giao diện cho các tổ chức là gì? Những gì nhà nước hiện một giao diện có cần phải được tiếp tục tồn tại? Giao diện là về hành vi, không phải trạng thái và tôi không thấy lý do bạn muốn duy trì giao diện. –

+2

Tôi nhận ra điều này ... Mục đích là tạo một trừu tượng hóa trên khuôn khổ kiên trì, để có thể thực hiện nó nhiều lần, sử dụng các khung công tác khác nhau (hoặc không). Ứng dụng được đề cập đã được thiết lập hoàn toàn theo mô-đun, theo cách ngoài tầm kiểm soát của tôi và tôi cần một cách để chỉ định thư nào cơ sở dữ liệu có thể phản hồi và thuộc tính nào có đối tượng ... và như vậy: giao diện. Ý tưởng là người ta có thể triển khai giao diện và chuyển mô-đun. Tuy nhiên, việc triển khai thực hiện các giao diện cho một số rắc rối với Hibernate ... và do đó câu hỏi của tôi. – wen

Trả lời

15

lẽ OneToOne.targetEntity ?:

@OneToOne(targetEntity = HbnData.class, cascade = CascadeType.ALL) 
private Data someData; 
+0

Cảm ơn, đó thực sự là những gì tôi đang tìm kiếm. ^^ – wen

+0

Tương tự ở đây! Bạn là người hùng của tôi! – nterry

+0

Tôi không thấy cách giải quyết vấn đề này, nó vẫn bị giới hạn ở một loại. Thay thế dữ liệu bằng HbnData giống nhau không? – MilacH

3

Giao diện mà tôi thường sử dụng là Đối tượng truy cập dữ liệu hoặc DAO. Sử dụng Generics Java, tôi có thể viết nó chỉ một lần; Hibernate làm cho nó có thể để viết thực hiện chỉ một lần, quá:

package persistence; 

import java.io.Serializable; 
import java.util.List; 

public interface GenericDao<T, K extends Serializable> 
{ 
    T find(K id); 
    List<T> find(); 
    List<T> find(T example); 
    List<T> find(String queryName, String [] paramNames, Object [] bindValues); 

    K save(T instance); 
    void update(T instance); 
    void delete(T instance); 
} 
Các vấn đề liên quan