9

是否可以将类注释为@Embeddable或属性为@Embedded

示例代码:

@Embeddable
class A{
...
}

class B{
...
}

@Entity
class Foo {
    A a;
    @Embedded B b;
}

什么时候更喜欢@Embedded@Embeddable

4

4 回答 4

12

据我所知, @Embedded/有两个主要用途:@Embeddable

首先,也是最重要的:拆分大型实体类。在数据库世界中,一张大表(一个有很多列)就可以了。分解这样的表甚至可能使事情变得更糟,并且与数据库设计原则相冲突。另一方面,在 Java(或一般的面向对象语言)中,一个大类是code smell. 在这里,我们想将包括实体类在内的类拆分成更小的单元。@Embedded/@Embeddable允许我们轻松地做到这一点,而不必拆分数据库表。

其次,它允许重用实体之间的公共映射。假设每个表都有一个简单的修订跟踪,两列包含更改行的人的用户名和发生时间。然后,可以创建一个@Embeddable覆盖这些行的实体,然后通过嵌入它在所有实体中重用它(而不是在每个实体中重复与这些列对应的变量。)

于 2016-02-03T12:39:43.180 回答
8

如果我们有两个 POJO 的 Person 和 Address,您将不想为 Address 创建另一个表,但您希望将地址嵌入到 person 表中。所以 Address 正在为 Person 对象添加值,但单独没有任何意义。在这种情况下,我们可以选择:

@Embeddable
public class Address{
}

@Entity
public class Person
{
    @Embedded
    private Address address;
}
于 2016-02-03T11:38:49.603 回答
3

您可以一起使用@Embeddable 和@Embedded。您将您的类标记为@Embeddable,这表明该类不会作为单独的表存在于数据库中。现在,当您在字段本身上使用 @Embedded 时。

embeddable和embedded这个词实际上给了你一个很大的线索。

Embeddable = 这个类可以嵌入到一个类中 Embedded = 这个类现在将作为一个字段嵌入到你的类中。

于 2018-05-02T10:37:31.680 回答
0

我想如果您将类注释为@Embeddable不需要将字段注释为@Embedded. 此外,如果您将 class 注释为@Embeddable并希望将其用作主键,则可以@Id仅使用,但如果未注释为@Embeddable,则必须使用@EmbeddedIdon 字段作为主键。

于 2019-06-13T08:03:37.373 回答