@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Problem {
@ManyToOne
private Person person;
}
@Entity
@DiscriminatorValue("UP")
public class UglyProblem extends Problem {}
@Entity
public class Person {
@OneToMany(mappedBy="person")
private List<UglyProblem> problems;
}
Tôi nghĩ rằng điều này khá rõ ràng những gì tôi đang cố gắng làm. Tôi mong đợi @ManyToOne người được thừa hưởng bởi lớp UglyProblem. Nhưng sẽ có một ngoại lệ nói một cái gì đó như: "Không có tài sản như vậy được tìm thấy trong lớp UglyProblem (mappedBy =" person ")".Tại sao @OneToMany không hoạt động với thừa kế trong Hibernate
Tất cả những gì tôi tìm thấy là this. Tôi không thể tìm thấy bài viết của Emmanuel Bernard giải thích lý do đằng sau điều này.
Thật không may, theo các tài liệu Hibernate "Properties từ superclasses không ánh xạ như @MappedSuperclass được bỏ qua."
Vâng, tôi nghĩ rằng điều này có nghĩa rằng nếu tôi có hai loại cổ phiếu này:
public class A {
private int foo;
}
@Entity
public class B extens A {
}
sau đó trường foo
sẽ không được ánh xạ cho lớp B. Trong đó có ý nghĩa. Nhưng nếu tôi có một cái gì đó như thế này:
@Entity
public class Problem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class UglyProblem extends Problem {
private int levelOfUgliness;
public int getLevelOfUgliness() {
return levelOfUgliness;
}
public void setLevelOfUgliness(int levelOfUgliness) {
this.levelOfUgliness = levelOfUgliness;
}
}
tôi hy vọng các UglyProblem lớp để có fileds id
và name
và cả hai lớp được ánh xạ sử dụng cùng một bảng. (Trong thực tế, đây là chính xác những gì sẽ xảy ra, tôi vừa kiểm tra lại). Tôi đã nhận được bảng này:
CREATE TABLE "problem" (
"DTYPE" varchar(31) NOT NULL,
"id" bigint(20) NOT NULL auto_increment,
"name" varchar(255) default NULL,
"levelOfUgliness" int(11) default NULL,
PRIMARY KEY ("id")
) AUTO_INCREMENT=2;
Trở lại với câu hỏi của tôi:
Tôi hy vọng người @ManyToOne được thừa hưởng bởi lớp UglyProblem.
Tôi hy vọng rằng vì tất cả các trường được ánh xạ khác được kế thừa và tôi không thấy bất kỳ lý do nào để làm ngoại lệ này cho các mối quan hệ ManyToOne.
Vâng, tôi đã thấy điều đó. Trong thực tế, tôi đã sử dụng giải pháp Chỉ đọc cho trường hợp của mình. Nhưng câu hỏi của tôi là "Tại sao ..." :). Tôi biết rằng có một lời giải thích được đưa ra bởi một thành viên của nhóm ngủ đông. Tôi đã không thể tìm thấy nó và đó là lý do tại sao tôi hỏi.
Tôi muốn tìm hiểu động cơ của quyết định thiết kế này.
(nếu bạn quan tâm như thế nào tôi đã phải đối mặt với vấn đề này: Tôi thừa hưởng một dự án được xây dựng bằng cách sử dụng ngủ đông 3. Đó là Jboss 4.0.something + hibernate đã có (bạn sẽ tải xuống tất cả cùng nhau). để Jboss 4.2.2 và tôi phát hiện ra rằng có được thừa kế ánh xạ của "@OneToMany mappedBy" và nó hoạt động tốt trên thiết lập cũ ...)
Bạn nên bổ sung thêm chi tiết về chỉnh sửa của bạn vào ngày 04 Tháng Chín.Chỉ định Danh sách thay vì chỉ Danh sách trong ánh xạ @OneToMany (mappedBy = "person") thay đổi bản chất của vấn đề, vì tôi nghĩ rằng trước đây chúng tôi giả định bạn muốn ánh xạ một Người vào danh sách Sự cố (không phải là Ugl –