Jpa 覆盖@Column属性值

Jpa 覆盖@Column属性值,jpa,jooq,Jpa,Jooq,我有几个POJO,有一定的金额。我的想法是创建一个通用对象MonetaryAmount(由一种货币和一个值组成),当我想在我的一个POJO中表示货币金额时,就可以使用它: public class MonetaryAmount { private String currency; private BigDecimal value; } public class Account { @Column(name = "ACCOUNT_NAME") private S

我有几个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
属性进行注释,因为列名在所有情况下并不总是相同的。是否有任何方法对
MonetaryAmount
属性进行注释(如上例中的
balance
)要提供
货币
属性的列名,使jOOQ在映射/取消映射POJO时能够理解它们,请使用与Hibernate解释注释类似的方式?

假设Hibernate:可以使用
嵌入的
组件

@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;
}

虽然这应该是可行的,但我认为在您的案例中,您应该尝试继承,并且仍然使用相同的方法以面向对象的方式覆盖属性。

jOOQ的
DefaultRecordMapper目前还不支持
@Embeddeble
注释(jOOQ 3.11)。相关功能要求包括:

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

ctx.select(
账户。账户名称(“名称”),
账户.货币.as(“余额.货币”),
账户.VALUE.as(“余额.VALUE”))
.来自(账户)
.fetchInto(Account.class);
此功能记录在中,请参阅:

如果Field.getName()是MY_Field.MY_nested_Field(区分大小写!),则此字段的值将被视为嵌套值MY_nested_Field,该值在传递给所有这些字段的嵌套POJO上设置(不考虑可见性):

  • 单参数实例方法MY_字段(…)
  • 单参数实例方法myField(…)
  • 单参数实例方法setMY_字段(…)
  • 单参数实例方法setMyField(…)
  • 非最终实例成员字段MY_字段
  • 非最终实例成员字段myField

谢谢你的回复,卢卡斯。因此,如果我理解正确,
DefaultRecordMapper
会检查类级别而不是属性/成员级别的注释,即如果一个成员正在使用注释,
DefaultRecordMapper
会假设所有成员都在使用注释,对吗?另外,因为我已经在使用JPA注释了,请问还有其他选择吗?@user1135357:是的。目标POJO类型要么是JPA注释的,要么不是。混合这些行为太令人惊讶了。有一个挂起的功能请求,要求在存在
@表
@实体
批注的情况下,使
@列
批注成为可选的。我想不出直接使用JOOQAPI的替代方案。当然,您可以随时编写自己的
记录映射器
或使用第三方映射器,例如。