【问题标题】:@AttributeOverride - inherit some attributes as default values@AttributeOverride - 继承一些属性作为默认值
【发布时间】:2015-07-28 21:11:37
【问题描述】:

可嵌入的 Money 类中有面额字段。

@Column(scale = 4, precision = 20)
private BigDecimal denomination;

当我在某个实体类中多次使用 Money 类时,我必须通过 @AttributeOverride 注解覆盖列名。

@Embedded
@AttributeOverrides({
    @AttributeOverride(name = "denomination", column = @Column(name = "premium_amount")),
    @AttributeOverride(name = "currencyCode", column = @Column(name = "premium_amount_currency")) })
private Money premium;

@Embedded
@AttributeOverrides({
    @AttributeOverride(name = "denomination", column = @Column(name = "discount_amount")),
    @AttributeOverride(name = "currencyCode", column = @Column(name = "discount_amount_currency")) })
private Money discount;

这种方式也将 (scale = 4, precision = 20) 属性覆盖为默认值。是否可以默认继承这些属性或者我必须每次都指定它们?

【问题讨论】:

    标签: java jpa mapping


    【解决方案1】:

    很遗憾,这是不可能的。

    与JPA无关,但与注解有关: 如果您在运行时评估注释,例如Column.scale(),您无法判断是否有人明确设置了属性的值,或者它是否未包含在声明中。

    所以从 JPA 提供者的角度来看,两个定义是相等的:@Column()@Column(scale = 0, precision = 0)。由于提供者无法区分这两种定义,因此它将始终使用从scale() 返回的值——在您的情况下为默认值0

    因此,您必须明确设置这些值 - 或使用一些自动派生适当注释的代码生成工具(尽管我不知道哪个会开箱即用)。

    【讨论】:

    • 知道了!感谢您的详细回答)
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2010-09-05
    • 2018-06-07
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多