2013-01-11 21 views
7

Với cấu trúc lớp sau đây:Tôi có thể sử dụng Kho lưu trữ chung cho tất cả trẻ em của một MappedSuperClass với JPA dữ liệu Spring không?

@MappedSuperclass 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class Animal {} 

@Entity 
public class Dog {} 

@Entity 
public class Cat {} 

Với liệu mùa xuân JPA, là nó có thể sử dụng một generic Animal Repository để tồn tại một Animal khi chạy mà không biết đó loại Animal nó là gì?

Tôi biết tôi có thể làm điều đó bằng cách sử dụng thực thể Repository mỗi và bằng cách sử dụng instanceof như thế này:

if (thisAnimal instanceof Dog) 
    dogRepository.save(thisAnimal); 
else if (thisAnimal instanceof Cat) 
    catRepository.save(thisAnimal); 
} 

nhưng tôi không muốn dùng đến việc thực hành xấu của việc sử dụng instanceof.

Tôi đã cố gắng sử dụng một Repository chung như thế này:

public interface AnimalRepository extends JpaRepository<Animal, Long> {} 

Nhưng kết quả này trong ngoại lệ này: Not an managed type: class Animal. Tôi đoán vì Animal không phải là Entity, đó là MappedSuperclass.

Giải pháp tốt nhất là gì?

BTW - Animal được liệt kê với phần còn lại của các lớp học của tôi trong persistence.xml, do đó, đó không phải là vấn đề.

Trả lời

4

Thực tế vấn đề là do ánh xạ của bạn. Bạn hoặc sử dụng @MappedSuperclasshoặc@Inheritance. Cả hai cùng nhau không có ý nghĩa. Thay đổi pháp nhân của bạn thành:

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class Animal {} 

Đừng lo lắng, lược đồ cơ sở dữ liệu cơ bản giống nhau. Bây giờ một, chung AnimalRepository sẽ hoạt động. Hibernate sẽ làm nội tâm và tìm ra bảng nào để sử dụng cho một kiểu con thực tế.

+0

Liệu 'Động vật' có được liệt kê là một lớp trong đơn vị kiên trì của tôi trong' persistence.xml' không? Đề xuất của bạn đã thay đổi đang gây ra ngoại lệ mới: 'Không thể tạo EntityManagerFactory'. –

+0

@CFL_Jeff: thông thường tôi chỉ dựa vào chú thích, vì vậy tôi không chắc chắn. Bạn có thể xuất bản dấu vết ngăn xếp đầy đủ ở đâu đó, bao gồm 'Gây ra bởi' không? –

+0

Dường như tôi có vấn đề khác ngoài vấn đề này. Tôi tin rằng bạn đã giúp tôi giải quyết vấn đề trên tay, và tôi sẽ làm việc về những vấn đề mới. Cảm ơn! –

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