当前位置: 首页 > 面试题库 >

休眠多态性

向俊贤
2023-03-14
问题内容

这是一个Hibnerate多态性问题和一个数据模型设计问题。他们交织在一起。过去我曾经使用过Hibernate,并且很喜欢它,但是有时候我发现很难想到除了琐碎的设计之外的任何事情。不能敲打hibernate;只是观察到ORM通常可能具有挑战性。

我认为这是一个Hibernate 101问题,但我不确定。我试图实现的目标甚至不可能。

我有一个抽象类Fruit,它将被分为Apple和Orange。我有一个Note类,表示有关Apple和Orange的注释或评论。一个Apple或Orange可以有许多与之关联的注释,但是只有一个Apple或Orange可以与给定的Note关联。

这是这些类的草图,我现在在这里省略了对象ID的去向,以及将它们与Orange区别开的Apple的属性。就目前而言,我对使用哪种Hibernate继承策略并不感到很满意。

abstract public class Fruit {
}

// Apples have notes written about them:
public class Apple extends Fruit {
   private Set<Note> note;
   ...

   @OneToMany(cascade = CascadeType.ALL)
   public Set<Note> getNote() {
       return note;
   }
}


// Oranges have notes written about them:
public class Orange extends Fruit {
   private Set<Note> note;
   ...

   @OneToMany(cascade = CascadeType.ALL)
   public Set<Note> getNote() {
       return note;
   }
}

这是当前实现的Note类,其中我们看到它具有Apple和Orange的字段。这种设计的缺陷或不足之处在于,单个音符实例将仅指向Apple或Orange中的一个,而不会指向两者。因此,如果将Note绑定到Apple,则Orange字段是多余且难看的,反之亦然。

// A note about an Apple or Orange
public class Note {
   private String theNote;
   private Apple apple; 
   private Orange orange;
   ...

   // with the usual many to one mapping
   @ManyToOne
   @JoinColumn(name = "apple_id")
   public Apple getApple() { 
       return apple;
   }

   // with the usual many to one mapping
   @ManyToOne
   @JoinColumn(name = "orange_id")
   public Orange getOrange() {
       return orange;
   }

   ...
}

然而,这是提示类,我 我要我的基础上设计的,但我不知道如何思考这对于Hibernate的注释和表映射:

// A note about a fruit:
public class Note {
   private String theNote;
   private Fruit fruit;
   ...
}

这样,水果将是Apple或Orange实例。

后面的Note类(引用了Fruit)实际上可以容纳Apple或Orange,甚至可以与Hibernate
ORM映射进行协调吗?如果是的话,有人可以谈谈如何。


问题答案:

这绝对是可能的。您可以将注释与抽象Fruit类相关联,而不必在每个实现中都重复它们:

@Entity
@Inheritance
public abstract class Fruit {
   private Set<Note> notes;
   ...

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "fruit")
   public Set<Note> getNotes() {
       return notes;
   }
}

@Entity
public class Apple extends Fruit {
   ...
}


@Entity
public class Orange extends Fruit {
   ...
}

@Entity
public class Note {
   private String theNote;

   @ManyToOne
   private Fruit fruit;
   ...
}

瞧!

-基于注释的添加: JPA提供了多种处理继承的策略。Java
EE教程中
的相关部分将帮助您入门。

基本上,您可以选择:

  • 将所有内容存储在一个表中,并使用区分符列知道哪一行是哪种类型
  • 将每个具体的类(Apple和Orange)存储在单独的表中
  • 拥有一个带有鉴别符列的通用水果表,以及带有水果表外键的苹果和橙色表

另一个编辑:
注意这是一个Hibernate,而不是JPA问题。但是,因为选项相同,所以差别不大。这是Hibernate文档中的相关部分。



 类似资料:
  • 问题内容: 我有实体类A和C。它们正在映射表tblA和tblC,并且它们之间具有多对多关系,而tblB则在它们之间进行映射。tblB包含A_ID,C_ID和SetDate,最后一个是它的设置日期,因此是关系的属性。我的问题是,如何最好地映射此属性?目前,它们尚未映射,如下所示: A: C: 我应该如何从中获取tblB.SetDate? 干杯 尼克 问题答案: 据我所知, 不可能 以这种方式进行映射

  • 问题内容: 有没有办法使用Hibernate全局设置属性(因此它将是所有实体的默认设置)? 问题答案: 在NHibernate中是 我不知道hibernate中的确切语法。

  • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它将在-预期行为中再次创建新行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hi

  • 问题内容: 我有两个与多对多关联的表。 —数据库片段: 加载 ID 名称 会话 ID 日期 sessionsloads LoadId 的SessionID —hibernate映射片段: 为了从关联表 sessionloads中 删除一个条目,我执行以下代码: 但是,启动后,此代码将保持不变。 删除关联的正确方法是什么? 问题答案: 您需要更新和之间的链接的两端: 实际上,许多开发人员使用防御性方

  • 问题内容: 我有一个Spring和Hibernate3在生产中运行良好的应用程序。以下是Spring的applicationContext.xml中会话工厂的配置 生产正常。 现在,对于另一个项目,我们正在迁移到Hibernate4。我们使用org.springframework.orm.hibernate4。*包中的Hibernate 4的SessionFactory,TransacionMan

  • 问题内容: 我想使用联接表在两个表之间建立一对多关系。 最后,我想使用Hibernate批注执行此操作。 我找到了一些使用xml映射执行此操作的示例,但没有带注释的示例。 我相信这就是需要创建表的方式 问题答案: 不要寻找例子。阅读官方文档: 另外,请注意,这是单向一对多关联的默认设置。因此,如果默认的表名和列名适合您,您甚至不必提供注释。