是否可以将类注释为@Embeddable
或属性为@Embedded
?
示例代码:
@Embeddable
class A{
...
}
class B{
...
}
@Entity
class Foo {
A a;
@Embedded B b;
}
什么时候更喜欢@Embedded
和@Embeddable
?
是否可以将类注释为@Embeddable
或属性为@Embedded
?
示例代码:
@Embeddable
class A{
...
}
class B{
...
}
@Entity
class Foo {
A a;
@Embedded B b;
}
什么时候更喜欢@Embedded
和@Embeddable
?
据我所知, @Embedded
/有两个主要用途:@Embeddable
首先,也是最重要的:拆分大型实体类。在数据库世界中,一张大表(一个有很多列)就可以了。分解这样的表甚至可能使事情变得更糟,并且与数据库设计原则相冲突。另一方面,在 Java(或一般的面向对象语言)中,一个大类是code smell
. 在这里,我们想将包括实体类在内的类拆分成更小的单元。@Embedded
/@Embeddable
允许我们轻松地做到这一点,而不必拆分数据库表。
其次,它允许重用实体之间的公共映射。假设每个表都有一个简单的修订跟踪,两列包含更改行的人的用户名和发生时间。然后,可以创建一个@Embeddable
覆盖这些行的实体,然后通过嵌入它在所有实体中重用它(而不是在每个实体中重复与这些列对应的变量。)
如果我们有两个 POJO 的 Person 和 Address,您将不想为 Address 创建另一个表,但您希望将地址嵌入到 person 表中。所以 Address 正在为 Person 对象添加值,但单独没有任何意义。在这种情况下,我们可以选择:
@Embeddable
public class Address{
}
@Entity
public class Person
{
@Embedded
private Address address;
}
您可以一起使用@Embeddable 和@Embedded。您将您的类标记为@Embeddable,这表明该类不会作为单独的表存在于数据库中。现在,当您在字段本身上使用 @Embedded 时。
embeddable和embedded这个词实际上给了你一个很大的线索。
Embeddable = 这个类可以嵌入到一个类中 Embedded = 这个类现在将作为一个字段嵌入到你的类中。
我想如果您将类注释为@Embeddable
不需要将字段注释为@Embedded
. 此外,如果您将 class 注释为@Embeddable
并希望将其用作主键,则可以@Id
仅使用,但如果未注释为@Embeddable
,则必须使用@EmbeddedId
on 字段作为主键。