Hibernate设计模式问题

时间:2011-01-21 22:04:12

标签: java hibernate

我正在使用Hibernate。它很棒。但是,假设我有一个对应于数据库表的类,只有getter和setter以及toString,相同的方法。现在我想添加一些帮助目的的方法,例如,假设我想使用一些添加的描述文本获取创建日期,如下所示。

public class Client {
        private long id;
        private Calendar creationDate;
        protected String password;

            public long getId() {
            return id;
        }

        @SuppressWarnings("unused")
        private void setId(long id) {
            this.id = id;
        }

        public Calendar getCreationDate() {
            return creationDate;
        }

        public void setCreationDate(Calendar creationDate) {
            this.creationDate = creationDate;
        }

        ..
        .. some other getters and setters that corresponding to SQL columns 

        //Here I would like to have some help methods. Is it recommended to put it here?
        public String getCreationDateInSecs() {
            return "Date in secs: " + creationDate.getTimeInMillis * 1000;
        }
    }

问题是:我应该在哪里放置这种方法?

我应该将它与Value Object放在同一个类中,还是应该将它放在其他地方?如果你知道我的意思,我想知道最佳实践=)

祝你好运

3 个答案:

答案 0 :(得分:5)

Bozho基本上概述了两种可能的方法:富模型贫血模型,并建议将丰富的模型作为更多的OOPish。我会在这里提倡一种贫血的方法。

您描述的功能看起来像是表示层的责任。我认为将它放入与UI相关的类而不是域模型中会更好。

只要逻辑与

一样简单,将其置于域模型中就会变得无害
return "Date in secs: " + creationDate.getTimeInMillis * 1000;

但是,假设您还需要返回本地化描述。您必须在域模型中添加对本地化工具的依赖性,这会增加代码的耦合。

因此,最好将不同层的职责分开。

答案 1 :(得分:4)

在实体中添加方法绝对没问题。它属于它所在的位置,因为它在对象的内部状态下运行。

您可以创建一个实用工具方法,例如ClientUtils.getCreationDateInSeconds(client),但这不是非OOP。

答案 2 :(得分:0)

如果您担心将实体与此类方法混合在一起,并且您有许多DAO方法,则可以考虑使用面向方法。

它允许您在不违反OO原则的情况下,在单独的“方面”中分离纯实体内容,DAO内容和其他实用方法。

Spring和AspectJ做得很好。 如果您想快速了解如何实现内容,请查看: http://static.springsource.org/spring-roo/reference/html/architecture.html