java - 为什么 @OneToMany 不适用于 Hibernate 中的继承

标签 java hibernate inheritance orm

@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 类继承。但是会有一个异常(exception),它会说类似这样的话:“在 UglyProblem 类 (mappedBy="person") 中找不到这样的属性。

我找到的全部是 this .我找不到 Emmanuel Bernard 解释这背后原因的帖子。


Unfortunately, according to the Hibernate documentation "Properties from superclasses not mapped as @MappedSuperclass are ignored."

嗯,我认为这意味着如果我有这两个类:

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 并且这两个类将使用同一个表进行映射。 (事实上​​ ,这正是发生的情况,我刚刚再次检查过)。我有这张 table :

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;

回到我的问题:

I expect @ManyToOne person to be inherited by UglyProblem class.

我预计这是因为所有其他映射字段都是继承的,而且我看不出有任何理由为 ManyToOne 关系设置此异常(exception)。


是的,我看到了。事实上,我为我的案例使用了只读解决方案。但我的问题是“为什么……”:)。我知道 hibernate 团队的成员给出了解释。我找不到它,这就是我问的原因。

我想找出这个设计决策的动机。

(如果你对我是如何面对这个问题感兴趣的话:我继承了一个使用 hibernate 3 构建的项目。它是 Jboss 4.0.something + hibernate 已经存在(你会一起下载)。我正在将这个项目移动到Jboss 4.2.2,我发现有“@OneToMany mappedBy”的继承映射,它在旧设置上运行良好......)

最佳答案

在我的例子中,我想使用 SINGLE_TABLE 继承类型,所以使用 @MappedSuperclass 不是一个选项。

虽然不是很干净,但有效的是添加 Hibernate 专有 @Where @OneToMany 关联的子句以强制查询中的类型:

@OneToMany(mappedBy="person")
@Where(clause="DTYPE='UP'")
private List< UglyProblem > problems;

关于java - 为什么 @OneToMany 不适用于 Hibernate 中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057/

相关文章:

java - 类型不匹配错误 : Cannot convert from Player to Thread

java - Spring Boot Controller 重定向不起作用

java - Android重建项目,包org.junit不存在错误

hibernate - 如何仅删除前 100 行?

java - 需要帮助设置 Spring/Hibernate Mysql 设置

java - 将对象声明为其父类(super class)与其类之间的区别?

java - FFT realforward 与 realforwardfull 示例

sql - 我可以结合使用 querydsl-jpa 和 querydsl-sql 来创建对底层数据库的增量更改吗?

javascript - for-in 与没有继承属性的 Object.keys forEach

c++ - C++ 中有没有办法将父类转换/复制到子类中?