是否可以将某个类注释为@Embeddable
或将属性注释为@Embedded
?
示例代码:
@Embeddable
class A{
...
}
class B{
...
}
@Entity
class Foo {
A a;
@Embedded B b;
}
何时选择@Embedded
和@Embeddable
?
答案 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}}在现场用作主键。