当前位置: 首页 > 面试题库 >

使用Hibernate / JPA逐案排除@Embedded属性中的字段

杜苏燕
2023-03-14
问题内容

我正在将Hibernate hbm.xml文件中的某些类迁移到JPA批注。

我们有一个Address在多个地方使用的可嵌入类。每个位置使用地址中属性的不同子集。

(为简便起见,省略了getter / setter)

@Embeddable
public class Address {
  String email;
  String address;
  String city; 
  String state;
  String zip;
  String country;
}

@Entity
@Table(name="customer")
public class Customer {
  @Embedded
  @AttributeOverrides({
    @AttributeOverride(name="address", column=@Column(name="ship_addr"),
    @AttributeOverride(name="city", column=@Column(name="ship_city"),
    @AttributeOverride(name="state", column=@Column(name="ship_state"),
    @AttributeOverride(name="zip", column=@Column(name="ship_zip"),
    @AttributeOverride(name="country", column=@Column(name="ship_country")
  })
  Address shippingAddress;

  @Embedded
  @AttributeOverrides({
    @AttributeOverride(name="address", column=@Column(name="bill_addr"),
    @AttributeOverride(name="city", column=@Column(name="bill_city"),
    @AttributeOverride(name="state", column=@Column(name="bill_state"),
    @AttributeOverride(name="zip", column=@Column(name="bill_zip")
  })
  Address billingAddress;
}

请注意,在这个人为的示例中,shippingAddress使用Address.country,但billingAddress不使用;他们都不使用Address.email。

问题在于,Hibernate会@Column为我未明确提供的任何列推断标签。

我尝试将其添加@Transient到所有Address字段中,但似乎@AttributeOverride没有胜过@Transient

有什么解决方法吗?


问题答案:

我认为无法通过注释“忽略”嵌入式对象中地址中的字段。

一种解决方法是创建不带电子邮件的基本类型地址,并使用字段电子邮件创建ExtendedAddress(地址的子类)。



 类似资料:
  • 问题内容: 我正在将Hibernate hbm.xml文件中的某些类迁移到JPA批注。 我们有一个在多个地方使用的可嵌入类。每个位置使用地址中属性的不同子集。 (为简便起见,省略了getter / setter) 请注意,在这个人为的示例中,shippingAddress使用Address.country,但billingAddress不使用;他们都不使用Address.email。 问题在于,H

  • 问题内容: 类 两次作为两个不同的属性嵌入其中:和 在使用Persistence生成数据库架构时,应该分别提供两列。而是抛出一个异常: org.hibernate.MappingException:实体映射中的重复列:事件列:代码 如何覆盖每个属性的默认列名? 问题答案: 使用,这是一个示例 在您的情况下,它看起来像这样

  • 问题内容: 我在映射类的嵌入式属性时遇到麻烦。我创建了一些类,这些类与我试图说明的类相似。基本上,我有一个使用继承的@Embeddable类层次结构。顶级类“零件号”只有一个属性,扩展类没有为“零件号”类添加属性,它们仅添加了一些验证/逻辑。 这是我的意思: 部分 零件号 福特PARTNUMBER 高贵的零件编号 当然这是行不通的,因为Hibernate忽略了继承层次结构,并且不喜欢PartNum

  • 我想在JBoss7.1中使用Hibernate4.3的多租户特性。 通过在jboss-deployment-structure中添加以下行,我设法将其包含在我的war中 并在pom.xml中添加对hibernate核心和实体管理器的依赖项 这使得Hibernate4.3可以加载,但不幸的是,我出现了一个错误 这是因为在Hibernate4.3使用JPA2.1时加载了JPA2.0 从JBoss st

  • 问题内容: 我有一个实体课 } 在某些情况下,我不想加载对象A,因为我已经有了该对象。对于C也是如此。但是这些是特定的场景,我根本不想加载那些对象。 有什么方法可以告诉Hibernate不要加载实体对象的某些属性。{没有渴望/获取建议。我只希望仅在特定情况下才发生这种情况] 注意:我现在使用Criteria来获取对象。 问题答案: 由于用于查询,因此可以在运行时根据条件使用“ fetch”关键字指

  • 问题内容: hibernate中的property标签的lazy属性允许按照以下链接延迟加载属性:http : //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping- declaration -属性 lazy(可选-默认为false):指定在首次访问实例变量时应延迟获取此属性。它需要构建时字节码检测