抽象类上的Hibernate / JPA映射

时间:2011-03-08 12:58:46

标签: java mysql hibernate jpa

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

@Entity
public class Nose {
    ...
    // this causes: 'Basic' attribute should not be 'Persistence Entity' 
    ModelObjectWithNose owner;
}

2)有更好/更优选的方式吗?继承策略能否正常运作?

谢谢!

修改

所以我尝试了一些似乎都可行的方法。如果您在问题中设置注释,则使用三种继承方案中的任何一种都可以正常工作。不幸的是,这对我们现有的数据库和代码产生了巨大的影响,所以我们选择(现在)简单地索引Nose对象的id字段,该字段保存在我们当前的对象上,这些字段将扩展{{1并简单地编写辅助方法来进行点查询以查找条目。

1 个答案:

答案 0 :(得分:1)

Nose ModelObjectWithNose注释@OneToOneNoseModelObjectWithNose owner实体注释mappedBy实体。Nose设置ModelObjectWithNose实体注释的Nose属性,因此JPA知道应在哪个表中插入FK(在模型中Serializable应该具有FK到{{1}你没有别的办法。你把它设置在一对一关系的反面,即那个有PK的那个。)

BTW您的实体必须实现ModelObject(您可以在id类上执行此操作以在继承类时强制执行此操作)。 ModelObject的{​​{1}}属性应注释为@Id

干杯, 启