我有几个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理解它们的方式提供currency
和value
属性的列名在映射/取消映射POJO时,类似于Hibernate如何解释@AttributeOverride
注释?
答案 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;
}
尽管这应该可行,但我认为在您的情况下,您应该尝试继承并仍然使用相同的方法以面向对象的方式覆盖属性。