何时使用@Embedded和@Embeddable?

时间:2016-02-03 10:50:05

标签: java jpa javax.persistence

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

示例代码:

@Embeddable
class A{
...
}

class B{
...
}

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

何时选择@Embedded@Embeddable

4 个答案:

答案 0 :(得分:7)

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

首先,最重要的是:拆分大型实体类。在数据库世界中,一个大表(一个有很多列)很好。打破这样的表可能会使事情变得更糟,并且与数据库设计原则相冲突。另一方面,在Java(或一般的面向对象语言)中,大类是code smell。在这里,我们希望将类(包括实体类)拆分为更小的单元。 @Embedded / @Embeddable允许我们轻松地执行此操作,而无需拆分数据库表。

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

答案 1 :(得分:2)

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

@Embeddable
public class Address{
}

@Entity
public class Person
{
    @Embedded
    private Address address;
}

答案 2 :(得分:2)

您可以同时使用@Embeddable和@Embedded。您将类标记为@Embeddable,这表示此类将不作为单独的表存在于DB中。现在当你在字段本身上使用@Embedded时。

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

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

答案 3 :(得分:0)

我猜如果您将类注释为@Embeddable,则不需要将字段注释为@Embedded。另外,如果您将类注释为@Embeddable,并且希望将其用作主键,则只能使用@Id,但是如果未将其注释为@Embeddable,则必须使用{ {1}}在现场用作主键。