JPA 多个嵌入式字段

2022-08-31 11:53:45

JPA 实体类是否可以包含两个嵌入式 () 字段?例如:@Embedded

@Entity
public class Person {
    @Embedded
    public Address home;

    @Embedded
    public Address work;
}

public class Address {
    public String street;
    ...
}

在本例中,a 可以包含两个实例 - 家庭和工作。我正在将JPA与Hibernate的实现一起使用。当我使用Hibernate Tools生成架构时,它只嵌入了一个。我想要的是两个嵌入式实例,每个实例的列名都带有区分或预先附加一些前缀(例如家庭和工作)。我知道 ,但这需要单独覆盖每个属性。如果嵌入对象 () 变大,因为需要单独重写每列,这可能会变得很麻烦。PersonAddressAddressAddress@AttributeOverridesAddress


答案 1

通用的JPA方法是使用@AttributeOverride。这应该在EclipseLink和Hibernate中都有效。

@Entity 
public class Person {
  @AttributeOverrides({
    @AttributeOverride(name="street",column=@Column(name="homeStreet")),
    ...
  })
  @Embedded public Address home;

  @AttributeOverrides({
    @AttributeOverride(name="street",column=@Column(name="workStreet")),
    ...
  })
  @Embedded public Address work;
  }

  @Embeddable public class Address {
    @Basic public String street;
    ...
  }
}

答案 2

如果要在同一实体中两次使用相同的可嵌入对象类型,则列名缺省值将不起作用:至少其中一列必须是显式的。休眠超越了 EJB3 规范,允许您通过命名策略增强缺省机制。默认组件安全命名策略是对默认 EJB3 命名策略的一个小改进,它允许嵌入对象缺省,即使在同一实体中使用两次也是如此。

来自 Hibernate Annotations Doc: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e714


推荐