当前位置: 首页 > 面试题库 >

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

锺离鸿
2023-03-14
问题内容
@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”的继承映射,并且在旧设置下工作得很好…)


问题答案:

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

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

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

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

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

PS .:对不起,丑图:D



 类似资料:
  • 问题内容: 有什么用的,并在Hibernate?因为我在互联网上发现的每个示例都将数据插入到单个表中,并使用两个不同的类来做到这一点。我的观点是,如果我使用单个表,那么我可以在单个类中映射所有列,那么为什么要使用不同的类。如果我们使用两个不同的表,则存在和hibernate关系。 问题答案: Hibernate 1中有两种对象。Value Object2 。实体 价值对象 是不能独立存在的对象。以

  • 问题内容: 为什么hibernate对这些类使用联接表? 我既不需要联接表也不需要双向关联:( 问题答案: 因为这是它的设计方式,也是JPA规范要求它映射这样的关联的方式。如果要在广告投放表中添加联接列,请使用 这是有据可查的。

  • 问题内容: 我刚刚下载了Hibernate 4.0.1最终版本的新版本。当我键入以下代码时,很奇怪: Eclipse IDE在STRING关键字上显示错误。我确定我的构建路径中有hibernatejar,并且还包含了以下代码: 我只是想知道为什么会发生这种情况? 问题答案: 因为该字段在4.0中不存在。 3.5中的现场文档说: 不推荐使用。 看到 http://opensource.atlassi

  • 本文向大家介绍为什么要使用 hibernate?相关面试题,主要包含被问及为什么要使用 hibernate?时的应答技巧和注意事项,需要的朋友参考一下 hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码。 hibernate 是一个优秀的 ORM 实现,很多程度上简化了 DAO 层的编码功能。 可以很方便的进行数据库的移植工作。 提供了缓存机制,是程序执行更改的高效

  • 问题内容: 当我读一本Java书籍时,作者曾说过,在设计类时,与继承一起使用通常是不安全的。例如: 在上面的类中,我们应放置,以便其他类不能从此继承。我的问题是,为什么允许另一个类从中继承是不安全的? 问题答案: 因为很难(不可能?)做到正确,尤其是 对称 属性 。 说你有一堂课。产生如果参数也是并且具有相同的重量。如果要实现,则仅当参数也是汽车(重量除外)时,它才应屈服,并且还应比较制造商,发动

  • 我们必须在可选元素“mappedby”中指定什么。是特定模型的table_name还是classname? 哪个是正确的? 这个