java - Hibernate 对象中的 POJO/模型中的 transient 对象通过 "Program To Interface"的实践效果如何?

标签 java hibernate design-patterns interface

我正在从事基本的金融/银行项目。有不同上下文的“金钱”,不仅是货币类型文本,而且我还需要其他操作。

在 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/

相关文章:

java - 1) Java 和 2) Groovy 会自动导入哪些包?

java - J2EE Struts、Spring 和 Hibernate 框架问题

c# - 访客模式的实现。小行星/宇宙飞船碰撞问题

java - 设计模式来处理特定于用户的版本显示

java - 回文与否 (SPOJ) Java

java - JCEF 是否有 URL 更改监听器

java - drools 6.0 中未知的 KieSession 名称(尝试将 drools 添加到现有的 maven/eclipse 项目中)

hibernate 空间 Unresolved 依赖关系 postgis-jdbc;1.5.3 : not found

mysql - 如何使用 Hibernate 和 log4j 只记录插入和更新?

javascript - 如何使用 1 行 javascript 构建器模式