gpt4 book ai didi

java - Hibernate多态性

转载 作者:搜寻专家 更新时间:2023-10-30 21:04:08 25 4
gpt4 key购买 nike

这是一道Hibnerate的多态题和数据模型设计问题;他们交织在一起。我过去使用过 Hibernate,并且享受其中,但有时我觉得难以思考关于除了琐碎的设计之外的任何事情。不是敲 Hibernate;只是ORM 通常具有挑战性的观察结果。

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

我有一个抽象类 Fruit 将被子类化为 Apple和橙色。我有一个代表笔记或评论的 Note 类关于苹果和橙子。一个 Apple 或 Orange 可以有很多 Notes与之相关联,但只有一个 Apple 或 Orange 会出现与给定的注释相关联。

这是类(class)的草图,我现在省略了哪里对象 id 和区分苹果的属性他们来自橙子。目前,我对使用哪种 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 绑定(bind)到一个 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;
}

...
}

但是,这是我认为我想基于我的 Note 类设计上,但我不确定如何尊重地考虑这个到 Hibernate 注释和表映射:

// A note about a fruit:
public class Note {
private String theNote;
private Fruit 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 提供了多种处理继承的策略。 relevant section in the Java EE tutorial应该可以帮助您入门。

基本上,您的选择是:

  • 将所有内容存储在一个表中并使用鉴别器列来了解哪一行是哪种类型
  • 将每个具体类(Apple 和 Orange)存储在单独的表中
  • 有一个带有鉴别器列的公共(public) Fruit 表,以及带有 Fruit 表外键的 Apple 和 Orange 表

另一个编辑:注意到这是一个 Hibernate 问题,而不是 JPA 问题。不过,不会有太大区别,因为选项是相同的。这是 relevant section in the Hibernate docs .

关于java - Hibernate多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/979200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com