"@AttributeOverride"是什么意思?

46

我目前正在重新学习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 类,它定义了一对@ColumnslastNamessn

哦,我从 O'Reilly 的《Enterprise JavaBeans 3.1》中借用了这个例子,该书由 Rubinger & Burke 撰写。

感谢您提供的任何帮助。

5个回答

50

这段话是在说组成嵌入式id的属性可能已经有预定义的列名(通过显式或隐式映射)。使用@AttributeOverride时,你的意思是“忽略其他关于存储在哪个列中的信息,使用我在这里指定的列名”。


好的,很酷,这比作者在书中写的更有意义。非常感谢! - user483040
好的且合理的回答 - Vivek Nerle

36

AttributeOverride

在UserDetails类中,我使用Address覆盖了homeAddressofficeAddress

这个地址POJO将在数据库中为两个表提供服务。

数据库:

Table1      Table2
STREET_NAME HOME_STREET_NAME
CITY_NAME   HOME_CITY_NAME
STATE_NAME  HOME_STATE_NAME
PIN_CODE    HOME_PIN_CODE

1
这是@AttributeOverride强大之处的一个很好的例子,但我认为它需要一些简单的解释。 - Yassin Hajaj
1
请勿使用图像展示代码。如果需要进行编辑,a) 某人无法编辑它并且必须重新输入所有代码,b) 如果您必须编辑它,则必须再次上传图像。 :/ - alexander

10
EmbeddedEmployeePK类是一个相当直观的@Embeddable类,它定义了一对@Column:lastName和ssn。
不完全正确 - EmbeddedEmployeePK定义了一对属性,然后将这些属性映射到列。 @AttributeOverride注释允许您重写嵌入类属性的映射到的列。
使用情况是当可嵌入类在不同情况下使用时,其列名不同,并且需要某种机制来让您更改这些列映射。例如,假设您有一个包含相同嵌入式实例的两个实体 - 它们不能都映射到相同的列名。

1
JPA 尝试将字段名映射到数据源中的列名,因此您在这里看到的是将字段变量的名称转换为数据库中列的名称。

1
你还可以覆盖其他列属性(不仅仅是名称)。 假设您想根据嵌入组件的人员更改 SSN 的长度。您可以像这样为该列定义一个 @AttributeOverride
@AttributeOverrides({
    @AttributeOverride(name = "ssn", column = @Column(name = "SSN", length = 11))
})
private EmbeddedEmployeePK pk;

请查看Hibernate注释文档中的"2.2.2.4. 嵌入式对象(又名组件)"
为了保留其他@Column属性(例如name和nullable),请将它们保持在覆盖列上,与您在原始列上指定的相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接