2011-04-25 29 views
5

Chúng tôi có một @MappedSuperclass class Entity trong đó xác định id mặc định và các máy phát điện:Cách ghi đè @GeneratedValue được khai báo trong siêu lớp được ánh xạ?

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Override 
public K getId() { 
    return id; 
} 

Tôi muốn không sử dụng bất kỳ máy phát điện trong lớp con Foo ở tất cả, bởi vì tôi sẽ cung cấp các khóa chính bản thân mình.

Tôi phải mở rộng Foo từ lớp cơ sở Entity, bởi vì rất nhiều và rất nhiều hàm phụ thuộc vào lớp cơ sở này. Chú thích @AttributeOverrides dường như không hỗ trợ ghi đè @GeneratedValue.

+0

bản sao có thể có của [Làm cách nào để ghi đè chiến lược GenerationType bằng chú thích Hibernate/JPA?] (Http://stackoverflow.com/questions/328202/how-do-i-override-the-generationtype-strategy-using- hibernate-jpa-annotations) –

Trả lời

0

Âm thanh với tôi như Foo không thực sự là loại phụ của Entity và không bao giờ nên thực sự mở rộng nó. Thừa kế là một hợp đồng mạnh mẽ. Bạn sẽ không mở rộng một cái gì đó chỉ để có được quyền truy cập vào một số phương pháp.

Trong chế độ ngủ đông khi bạn lấy đối tượng Foo từ cơ sở dữ liệu bạn thực sự cũng đang chọn từ bảng Thực thể. Cả hai bảng được nối thông qua trường @Id của chúng, bạn sẽ thấy số Id trong số Foo sẽ giống như Id trong Entity.

Điều này cho phép chúng tôi thực hiện các thao tác sau.

Entity entity = new Foo(); 
if (entity instanceof Foo) { 
    //we have a Foo object 
} else if(entity instanceof ...) { 
    //we have a ... 
} 

Nếu bạn muốn cung cấp Id của riêng bạn, bạn sẽ không còn mở rộng siêu lớp nữa. Nếu bạn có rất nhiều logic mà bạn muốn đưa vào một số lớp ngủ đông nhưng chúng không phải là các kiểu con thực sự của lớp, hãy cân nhắc sử dụng @Embedded để thay thế.

+0

Tôi nghĩ Xie đã đề cập rằng lớp cơ sở của anh ta là một lớp cha được ánh xạ và không phải là một thực thể, vì vậy ánh xạ của anh ta sẽ không được ánh xạ tới một bảng và do đó vấn đề tham gia sẽ không đến. Sử dụng các phương thức trừu tượng cho id trong lớp cơ sở và chú thích các phương thức getter trong lớp dẫn xuất có vẻ là cách. – Shailendra

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