Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时使用@Embedded和@Embeddeble?_Java_Jpa_Javax.persistence - Fatal编程技术网

Java 何时使用@Embedded和@Embeddeble?

Java 何时使用@Embedded和@Embeddeble?,java,jpa,javax.persistence,Java,Jpa,Javax.persistence,是否可以将类注释为@Embedded,或将属性注释为@Embedded 示例代码: @Embeddable class A{ ... } class B{ ... } @Entity class Foo { A a; @Embedded B b; } 当选择@Embedded和@embeddeble时?如果我们的Person和Address是两个POJO,则您不希望为Address创建另一个表,但希望将Address嵌入Person表中。所以Address是对Person对

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

示例代码:

@Embeddable
class A{
...
}

class B{
...
}

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

当选择
@Embedded
@embeddeble
时?

如果我们的Person和Address是两个POJO,则您不希望为Address创建另一个表,但希望将Address嵌入Person表中。所以Address是对Person对象的值进行累加,但对单个对象没有任何意义。在这种情况下,我们可以选择:

@Embeddable
public class Address{
}

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

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

首先,也是最重要的一点:拆分大型实体类。在数据库世界中,一个大表(一个有许多列的表)就可以了。分解这样一个表甚至可能使事情变得更糟,并与数据库设计原则相冲突。另一方面,在Java(或一般的面向对象语言)中,大型类是
代码气味
。在这里,我们希望将类(包括实体类)拆分为更小的单元
@Embedded
/
@embeddedable
允许我们轻松完成此操作,而无需拆分数据库表


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

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

事实上,单词embedded和embedded给了你一个很大的线索

Embeddeble=此类可以嵌入到类中
Embedded=该类现在将作为字段嵌入到您的类中。

我想如果您将类注释为
@Embedded
,则不需要将字段注释为
@Embedded
。此外,如果您将类注释为
@embedded
,并且希望将其用作主键,则只能使用
@Id
,但如果未将其注释为
@embedded
,则必须在字段上使用
@EmbeddedId
作为主键。

是否查阅了这些注释的Javadoc?