一尘不染

为什么@OneToMany无法在Hibernate中使用继承

hibernate

@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类映射字段。这很有意义。但是,如果我有这样的事情:

@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具有文件字段idname并且两个类都将使用同一表进行映射。(实际上,这正是发生的情况,我刚刚再次检查了一下)。我有这张桌子:

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”的继承映射,并且在旧设置下工作得很好…)


阅读 221

收藏
2020-06-20

共1个答案

一尘不染

我认为这是Hibernate团队做出的明智决定。他们可能不太自大,并明确说明了为什么以这种方式实施,但这就是伊曼纽尔,克里斯和加文的工作方式。:)

让我们尝试了解问题所在。我认为您的概念是“说谎”的。首先,你说,许多 问题 s的关联 。但是,然后您说一个 有很多
UglyProblem (并且与其他 Problem 无关)。该设计有问题。

想象一下它将如何映射到数据库。您具有单个表继承,因此:

          _____________
          |__PROBLEMS__|          |__PEOPLE__|
          |id <PK>     |          |          |
          |person <FK> | -------->|          |
          |problemType |          |_________ |
          --------------

如果其 问题* 类型等于UP,hibernate将如何强制数据库使 问题 仅与 人员
有关?这是一个很难解决的问题。因此,如果您想要这种关系,则每个子类都必须位于其自己的表中。就是那样
*@MappedSuperclass

PS .:对不起,丑图:D

2020-06-20