这是一个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教程中
的相关部分将帮助您入门。
基本上,您可以选择:
另一个编辑:
注意这是一个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映射执行此操作的示例,但没有带注释的示例。 我相信这就是需要创建表的方式 问题答案: 不要寻找例子。阅读官方文档: 另外,请注意,这是单向一对多关联的默认设置。因此,如果默认的表名和列名适合您,您甚至不必提供注释。