使用Hibernate实现以下情况的最佳做法是什么。
我们定义一个抽象类,它将构成我们想要在数据库中持久保存的任何对象的基础。它包含id等等......
public abstract class ModelObject {
protected int id;
...
}
现在我们为特殊情况继承我们的基础分支,其中多个实体将具有相似的字段。
public abstract class ModelObjectWithNose extends ModelObject {
...
protected Nose nose;
}
现在,对于我们想要拥有Nose
的所有课程:
public class Person extends ModelObjectWithNose { ... }
public class Animal extends ModelObjectWithNose { ... }
我们现在面临的真正问题是这种关系需要是双向的。每个具体类都需要知道哪些Nose
是他们的,但每个Nose
也需要知道它属于哪个对象。
public class Nose {
...
private ModelObjectWithNose owner;
}
对于我们的示例,我们需要@OneToOne
关系,因为每个Person
只能有一个Nose
,而每个Nose
只能属于一个Person
。
我们尝试过的是:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class ModelObjectWithNose extend ModelObject { ... }
然后:
@Entity
public class Person extends ModelObjectWithNose { ... }
...等等等。
1)如何定义Nose
和ModelObjectWithNose
之间的关系?它是如此简单:
@Entity
public class Nose {
...
// this causes: 'Basic' attribute should not be 'Persistence Entity'
ModelObjectWithNose owner;
}
2)有更好/更优选的方式吗?继承策略能否正常运作?
谢谢!
修改 的
所以我尝试了一些似乎都可行的方法。如果您在问题中设置注释,则使用三种继承方案中的任何一种都可以正常工作。不幸的是,这对我们现有的数据库和代码产生了巨大的影响,所以我们选择(现在)简单地索引Nose
对象的id
字段,该字段保存在我们当前的对象上,这些字段将扩展{{1并简单地编写辅助方法来进行点查询以查找条目。
答案 0 :(得分:1)
在Nose
ModelObjectWithNose
注释@OneToOne
,Nose
,ModelObjectWithNose owner
实体注释mappedBy
实体。Nose
设置ModelObjectWithNose
实体注释的Nose
属性,因此JPA知道应在哪个表中插入FK(在模型中Serializable
应该具有FK到{{1}你没有别的办法。你把它设置在一对一关系的反面,即那个有PK的那个。)
BTW您的实体必须实现ModelObject
(您可以在id
类上执行此操作以在继承类时强制执行此操作)。 ModelObject
的{{1}}属性应注释为@Id
。
干杯, 启