2012-09-24 21 views
9

Tôi cần biết liệu có thể thêm một số thuộc tính và hành vi cho một số thực thể POPA JPA hay không (bằng cách sử dụng nhà cung cấp hibernate) bằng cách mở rộng nó. entitys chỉ POJO, giống như các ví dụ sau:Mở rộng thực thể JPA để thêm thuộc tính và logic

POJO JPA Entity Lớp

@Entity 
@Table("test") 
public class Test implements Serializable { 
} 

Extended Lớp

public class ExtendedTest extends Test { 
... 
} 

Tìm nạp các mở rộng đối tượng Class của

List<ExtendedTest> extendedList = entityManager.createNamedQuery("ExtendedTest.findByFoo").setParameter("foo", "bar").getResultList(); 

Một cách khác có thể tôi đang đánh giá được mở rộng funcionality với một đối tượng hỗn hợp và ủy thác tất cả setters và thu khí, nhưng điều này có nghĩa là rất nhiều công việc với các bảng lớn:

public class ExtendedTest2 { 
    private Test test; 

    public ExtendedTest2(Test test) { 
     this.test = test; 
    } 

    public getFoo() { 
     return test.getFoo(); 
    } 

    public getBar() { 
     return test.getBar(); 
    } 

    ... 
} 

Mọi đề xuất sẽ được đánh giá cao.

+0

Tôi không nghĩ là tốt khi bạn hạnh phúc có thể đặt logic của bạn và các thuộc tính khác trong lớp thực thể. – dcernahoschi

+0

Tôi thực sự có thể thêm các thuộc tính và logic vào lớp thực thể của mình nhưng không "vui vẻ", ý tưởng của tôi là giữ các thực thể như POJO và chỉ giữ các thuộc tính biểu diễn bảng, trên thực tế đó là lý do tại sao tôi tạo câu hỏi này ngay từ đầu. – jmoreira

Trả lời

16

Sử dụng @Inheritance

@Entity 
@Table(name="TEST") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public class Test { 
    ... 
} 

@Entity 
public class ExtendedTest 
    extends Test { 
    ... 
} 

hoặc @MappedSuperclass

@MappedSuperclass 
public class Test { 
    ... 
} 

@Entity 
public class ExtendedTest 
    extends Test { 
    ... 
} 
+3

Chỉ nếu ai đó nhận được điều này, idk nếu nó sai hoặc vì phiên bản (JPA 2.1, liên kết nhật thực), nhưng tôi phải thêm chú thích '@Inheritance (strategy = InheritanceType.SINGLE_TABLE)' vào lớp con, không phải là phụ huynh – rekiem87

+2

Chỉ để tham khảo: khi sử dụng '@ Entity' trên lớp trừu tượng và mỗi thực thể có nguồn gốc sẽ tạo bảng riêng của nó, trong trường hợp này bạn phải sử dụng' @Inheritance (strategy = InheritanceType.TABLE_PER_CLASS) 'trên bảng * abstract parent * ! – membersound