Jpa 覆盖@Column属性值
我有几个POJO,有一定的金额。我的想法是创建一个通用对象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
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的替代方案。当然,您可以随时编写自己的记录映射器
或使用第三方映射器,例如。