在我的情况下,我想使用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进行编码,则以后可以更轻松地更改基础映射(减少破坏兼容性的风险)。
在我的情况下,我想使用SINGLE_TABLE继承类型,因此使用@MappedSuperclass不是一个选项.
什么有用,虽然不是很干净,但是将Hibernate专有的@Where子句添加到@OneToMany关联以强制查询中的类型:
@OneToMany(mappedBy="person")
@Where(clause="DTYPE='UP'")
private List< UglyProblem > problems;
不幸的是,根据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进行编码,则以后可以更轻松地更改基础映射(减少破坏兼容性的风险)。