抽象类上的Hibernate/JPA映射

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)如何定义NoseModelObjectWithNose?之间的关系?它是如此简单:

@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并简单地编写辅助方法来进行点查询以查找条目.

Kai*_*Kai 1

在as中注释您的Nose属性,并在您执行相同操作的实体中注释您的属性。设置实体注释的属性,以便 JPA 知道应该在哪个表上插入 FK(在您的模型中,应该将 FK 插入到,而不是其他方式。您将其设置在一对一的反端)一种关系,即具有可以使用的 PK 的关系。)ModelObjectWithNose@OneToOneNoseModelObjectWithNose ownermappedByNoseModelObjectWithNoseNose

顺便说一句,您的实体必须实现Serializable(您可以在ModelObject类上执行此操作以在继承类上强制执行它)。id的属性应ModelObject注释为@Id

干杯,凯