我正在从事基本的金融/银行项目。有不同上下文的“金钱”,不仅是货币类型文本,而且我还需要其他操作。
在 DB 中,我将金额保留为 NUMBER 字段,在 Hibernate 中保留为 BigDecimal 类型对象。假设 Transfer
是一个映射到表的对象,其中包含两个人之间的汇款信息;
@Entity
class Transfer {
@Id @Column
private Long id;
@Column
private Person from; //mapped personId
@Column
private Person to; //mapped personId
@Column
private BigDecimal amount;
//... setters & getters
}
但实际上;几乎总是我需要金额作为 Money 并使用特殊的 toString() 方法: asText() ,而不仅仅是 BigDecimal 对象,因为我正是需要这个:
Transfer t = dao.getMySpecialTransferObject();
System.out.println(t.money.asText());
但是我还是直接需要金额,因为我需要对金额做一些计算。 (我还需要其他实体中的 Money 类型对象)
现在我想我需要创建这样一个类;
class Money {
private BigDecimal amount;
//... setters & getters
public String asText(){
String textToReturn = "The amount of this money is: " + amount.toString;
// ... and some locale information and manipulation on textToReturn
return textToReturn;
}
}
随着复杂性的增加,设计模式说“程序到接口(interface)”,那么我想我会把这个 Money 作为接口(interface)和实现来实现;
interface Money{
public String asText();
}
class BasicMoney implement Money{
private BigDecimal amount;
//... setters & getters
public String asText(){
String textToReturn = "The amount of this money is: " + amount.toString();
// ... and some locale information and manipulation on textToReturn
return textToReturn;
}
所以我想用“Money”类型对象而不是金额来编辑我的 POJO“Transfer”。
@Entity
class Transfer {
@Id @Column
private Long id;
@Column
private Person from; //mapped personId
@Column
private Person to; //mapped personId
@Column
// Not anymore: private BigDecimal amount;
private Money money;
//... setters & getters
}
好了,现在问题来了:
我的 POJO“Transfer”将具有相同的“Money”类型对象,但是数据库关系呢? Money 不是数据库中的持久对象,因此我可能会使用 @Transient 注释,但我仍然需要 Money 和 DB 中的“金额”列之间的耦合/关系。我应该如何在 POJO 上保持这种关系?
注意;我们正在使用 util 类(没有接口(interface)或 transient 对象)进行格式化等,但我不确定这是否是最佳实践,并且我不想再开发 util 类,除非没有更好的解决方案。
最佳答案
将您的字段保留为 BigDecimal,只需添加带有静态函数的帮助器类,该函数会格式化/显示您的金额。 在这种情况下,提取 Money 接口(interface)没有意义,因为您只有“toString”方法。 请记住 KISS 原则。
关于java - Hibernate 对象中的 POJO/模型中的 transient 对象通过 "Program To Interface"的实践效果如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22091015/