覆盖@Column属性值

时间:2018-10-31 10:10:56

标签: jpa jooq

我有几个POJO,它们的金额都是一定的。我的想法是创建一个通用对象MonetaryAmount(由一种货币和一个值组成),然后当我想在其中一个POJO中表示货币金额时将使用该通用对象:

public class MonetaryAmount {
    private String currency;
    private BigDecimal value;
}

public class Account {

    @Column(name = "ACCOUNT_NAME")
    private String name;

    private MonetaryAmount balance; // TODO set column annotation values of currency and value

}

由于MonetaryAmount将在多个POJO中使用,因此我无法用currency来注释value@Column属性,因为列名并不总是在所有情况下都一样。有没有什么方法可以注释MonetaryAmount属性(例如,上例中的balance),以通过jOOQ理解它们的方式提供currencyvalue属性的列名在映射/取消映射POJO时,类似于Hibernate如何解释@AttributeOverride注释?

2 个答案:

答案 0 :(得分:2)

jOOQ的@Embeddable目前不支持DefaultRecordMapper批注(jOOQ 3.11)。相关功能请求为:

如果您在POJO上不使用JPA批注,现在可以做的就是在查询中使用以下别名符号:

ctx.select(
        ACCOUNT.ACCOUNT_NAME.as("name"),
        ACCOUNT.CURRENCY.as("balance.currency"),
        ACCOUNT.VALUE.as("balance.value"))
   .from(ACCOUNT)
   .fetchInto(Account.class);

此功能记录在DefaultRecordMapper中,请参阅:

  

如果Field.getName()为MY_field.MY_nested_field(区分大小写!),则该字段的值将被视为嵌套值MY_nested_field,该值在传递给所有这些值的嵌套POJO上设置(无论可见性如何) ):

     
      
  • 单参数实例方法MY_field(...)
  •   
  • 单参数实例方法myField(...)
  •   
  • 单参数实例方法setMY_field(...)
  •   
  • 单参数实例方法setMyField(...)
  •   
  • 非最终实例成员字段MY_field
  •   
  • 非最终实例成员字段myField
  •   

答案 1 :(得分:1)

假设处于休眠状态:您可以使用Embedded个组件。

@Entity
public class Account implements Serializable{

    @Column(name = "ACCOUNT_NAME")
    private String name;

    @Embedded
    @AttributeOverrides( {
       @AttributeOverride(name="currency", column = @Column(name="CURRENCY") ),
       @AttributeOverride(name="value", column = @Column(name="VALUE") )
    } ) private MonetaryAmount balance;

}

@Embeddable
public class MonetaryAmount implements Serializable{
    private String currency;
    private BigDecimal value;
}

尽管这应该可行,但我认为在您的情况下,您应该尝试继承并仍然使用相同的方法以面向对象的方式覆盖属性。