@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”)”。
我发现的就是这个。我找不到Emmanuel Bernard的帖子来解释其背后的原因。
不幸的是,根据Hibernate文档,“未映射为@MappedSuperclass的超类的属性将被忽略。”
好吧,我认为这意味着如果我有以下两个类别:
public class A { private int foo; } @Entity public class B extens A { }
则foo不会为B类映射字段。这很有意义。但是,如果我有这样的事情:
foo
@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并且两个类都将使用同一表进行映射。(实际上,这正是发生的情况,我刚刚再次检查了一下)。我有这张桌子:
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类继承。
我希望这是因为所有其他映射字段都是继承的,并且我看不出有任何理由要为ManyToOne关系设置此例外。
是的,我看到了。实际上,我为案例使用了只读解决方案。但是我的问题是“为什么……” :)。我知道hibernate团队的一个成员给出了解释。我找不到它,这就是为什么我问。
我想找出这个设计决定的动机。
(如果您感兴趣,我是如何面对这个问题的:我继承了一个使用hibernate 3构建的项目。它是Jboss 4.0。某物+ hibernate已经存在(您将它们全部下载)。我正在将该项目移至Jboss 4.2。 2,我发现存在“ @OneToMany mappingBy”的继承映射,并且在旧设置下工作得很好…)
我认为这是Hibernate团队做出的明智决定。他们可能不太自大,并明确说明了为什么以这种方式实施,但这就是伊曼纽尔,克里斯和加文的工作方式。:)
让我们尝试了解问题所在。我认为您的概念是“说谎”的。首先,你说,许多 问题 s的关联 人 。但是,然后您说一个 人 有很多 UglyProblem (并且与其他 Problem 无关)。该设计有问题。
想象一下它将如何映射到数据库。您具有单个表继承,因此:
_____________ |__PROBLEMS__| |__PEOPLE__| |id <PK> | | | |person <FK> | -------->| | |problemType | |_________ | --------------
如果其 问题* 类型等于UP,hibernate将如何强制数据库使 问题 仅与 人员 有关?这是一个很难解决的问题。因此,如果您想要这种关系,则每个子类都必须位于其自己的表中。就是那样 *@MappedSuperclass
@MappedSuperclass
PS .:对不起,丑图:D