我目前正在接受(返回)使用EJB的速度,当我离开时,它发生了巨大的变化(到目前为止更好)。然而,我遇到了一个我正在努力的概念,并希望更好地理解,因为它似乎在我们(我工作的地方,而不是我和我头脑中的所有声音)中使用了相当多的代码。
这是我在一本书中找到的例子。它是显示如何使用@EmbeddedId
注释的示例的一部分:
@Entity
public class Employee implements java.io.Serializable
{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="lastName", column=@Column(name="LAST_NAME"),
@AttributeOverride(name="ssn", column=@Column(name="SSN"))
})
private EmbeddedEmployeePK pk;
...
}
EmbeddedEmployeePK
类是一个相当简单的@Embeddable
类,它定义了一对@Columns
:lastName
和ssn
。
哦,我从O'Reilly的Enterprise JavaBeans 3.1中提取了这个例子,由Rubinger&伯克。
提前感谢您提供的任何帮助。
答案 0 :(得分:39)
它说组成嵌入式id的属性可能已经预定义(通过显式或隐式映射)列名。通过使用@AttributeOverride
,您可以“忽略关于存储在哪个列中的其他信息,并使用我在此处指定的信息”。
答案 1 :(得分:26)
在UserDetails类中,我覆盖了homeAddress
& officeAddress
与Address
这一个地址POJO将代表DB中的两个表。
<强> DB:强>
Table1 Table2
STREET_NAME HOME_STREET_NAME
CITY_NAME HOME_CITY_NAME
STATE_NAME HOME_STATE_NAME
PIN_CODE HOME_PIN_CODE
答案 2 :(得分:8)
EmbeddedEmployeePK类是一个相当简单的@Embeddable类,它定义了一对@Columns:lastName和ssn。
不完全 - EmbeddedEmployeePK
定义了一对属性,然后映射到列。 @AttributeOverride
注释允许您覆盖嵌入类的属性映射到的列。
这种情况的用例是当嵌入类用于其列名不同的不同情况时,需要一些机制来更改这些列映射。例如,假设您有一个实体,其中包含两个相同嵌入的单独实例 - 它们不能同时映射到相同的列名称。
答案 3 :(得分:1)
您还可以覆盖其他列属性(不仅仅是名称)
假设您要根据嵌入组件的人员更改SSN的长度。您可以为列定义@AttributeOverride
,如下所示:
@AttributeOverrides({
@AttributeOverride(name = "ssn", column = @Column(name = "SSN", length = 11))
})
private EmbeddedEmployeePK pk;
请参阅Hibernate Annotations文档中的"2.2.2.4. Embedded objects (aka components)"。
为了保留其他@Column
属性(例如name
和nullable
),请将它们保留在已覆盖的列上,与原始列中指定的相同。
答案 4 :(得分:0)
JPA尝试将字段名称映射到数据源中的列名称,因此您在此处看到的是字段变量名称与数据库中列名称之间的转换。