当前位置:  开发笔记 > 编程语言 > 正文

为什么@OneToMany在Hibernate中不能与继承一起使用

如何解决《为什么@OneToMany在Hibernate中不能与继承一起使用》经验,为你挑选了2个好方法。

在我的情况下,我想使用SINGLE_TABLE继承类型,因此使用@MappedSuperclass不是一个选项.

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

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


David Crow.. 5

不幸的是,根据Hibernate 文档, “未映射为@MappedSuperclass的超类的属性将被忽略。” 我也反对这一点。我的解决方案是通过接口而不是实体bean本身来表示所需的继承。

您可以定义以下内容:

public interface Problem {
    public Person getPerson();
}

public interface UglyProblem extends Problem {
}

然后使用抽象超类和两个实体子类实现这些接口:

@MappedSuperclass
public abstract class AbstractProblemImpl implements Problem {
    @ManyToOne
    private Person person;

    public Person getPerson() {
        return person;
    }
}

@Entity
public class ProblemImpl extends AbstractProblemImpl implements Problem {
}

@Entity
public class UglyProblemImpl extends AbstractProblemImpl implements UglyProblem {
}

另外一个好处是,如果您使用接口而不是使用实现这些接口的实际实体Bean进行编码,则以后可以更轻松地更改基础映射(减少破坏兼容性的风险)。



1> 小智..:

在我的情况下,我想使用SINGLE_TABLE继承类型,因此使用@MappedSuperclass不是一个选项.

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

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



2> David Crow..:

不幸的是,根据Hibernate 文档, “未映射为@MappedSuperclass的超类的属性将被忽略。” 我也反对这一点。我的解决方案是通过接口而不是实体bean本身来表示所需的继承。

您可以定义以下内容:

public interface Problem {
    public Person getPerson();
}

public interface UglyProblem extends Problem {
}

然后使用抽象超类和两个实体子类实现这些接口:

@MappedSuperclass
public abstract class AbstractProblemImpl implements Problem {
    @ManyToOne
    private Person person;

    public Person getPerson() {
        return person;
    }
}

@Entity
public class ProblemImpl extends AbstractProblemImpl implements Problem {
}

@Entity
public class UglyProblemImpl extends AbstractProblemImpl implements UglyProblem {
}

另外一个好处是,如果您使用接口而不是使用实现这些接口的实际实体Bean进行编码,则以后可以更轻松地更改基础映射(减少破坏兼容性的风险)。

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有