【发布时间】:2010-09-07 11:21:39
【问题描述】:
@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;
}
我认为我想做什么已经很清楚了。我希望 @ManyToOne 人被 UglyProblem 类继承。但是会有一个例外说:“在 UglyProblem 类中找不到这样的属性 (mappedBy="person")”。
我找到的只是this。我找不到 Emmanuel Bernard 的帖子,解释了这背后的原因。
不幸的是,根据 Hibernate 文档“未映射为 @MappedSuperclass 的超类的属性将被忽略。”
我认为这意味着如果我有这两个类:
public class A {
private int foo;
}
@Entity
public class B extens A {
}
然后字段foo 将不会映射到B 类。这是有道理的。但如果我有这样的事情:
@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;
}
}
我希望 UglyProblem 类有文件 id 和 name 并且两个类都使用同一个表进行映射。 (事实上,这正是发生的事情,我刚刚再次检查)。我有这张桌子:
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;
回到我的问题:
我希望 @ManyToOne 人被 UglyProblem 类继承。
我希望这是因为所有其他映射字段都是继承的,我认为没有任何理由为多对一关系设置此例外。
是的,我看到了。事实上,我在我的案例中使用了只读解决方案。但我的问题是“为什么……” :)。我知道hibernate团队的成员给出了解释。我找不到它,这就是我问的原因。
我想找出这个设计决策的动机。
(如果你对我是如何面对这个问题感兴趣的话:我继承了一个使用 hibernate 3 构建的项目。它是 Jboss 4.0。一些东西 + hibernate 已经存在(你可以一起下载)。我正在将此项目移动到Jboss 4.2.2,我发现有“@OneToMany mappedBy”的继承映射,它在旧设置上运行良好......)
【问题讨论】:
-
您应该在 9 月 4 日添加有关您的编辑的更多详细信息。在 @OneToMany(mappedBy="person") 映射中指定 List
而不是仅 List 会改变问题的性质,因为我认为我们之前假设您想将 Person 映射到问题列表(不是 Ugl
标签: java hibernate inheritance orm