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