论坛首页 Java企业应用论坛

在Java 实现真正的富领域Model层

浏览 20893 次
精华帖 (10) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-08-08   最后修改:2012-08-08
tianzizhi 写道
没看出来哪地方是富领域model层了,说的某一个的orm框架吧或对象sql工具,跟领域扯不上边,
领域是基于具体业务的,不是简单的CRUD放在model就完了

能不能先谈下你对富领域模型的看法?

另外在我看来。目前的Model是能够对自己进行操作的。也就是不仅仅是一个Pojo了。它承担了原本所有dao和部分service的功能。

除了 简单的CRUD model能够自我操作外,
还有丰富的查询接口,比如
List<Tag> tags = Tag.where("name='java'").join("tag_groups").fetch();


另外的,如果有一些常见需求,比如我之前举得例子,

@Entity
public class Tag extends Model {
    public static JPQL active(){
      return where("status=1");
    }
}


之后就可以直接调用这个方法。
List<Tag> tags =Tag.active().where("id>10").join("tag_groups").offset(0).limit(15).fetch(); 


也就是说你可以直接在model层内部定义比较复杂的查询,然后通过一个简单的方法暴露出来。这些都是由model层自己负责的,而不是委托给dao或者service.

同理,对于各种关联关系,都是model自己去维护的。

比如Tag 和 TagGroup多对对关系的建立:
传统的方式是:
tagGroup.getTags().add(tag);
tag.getTagGroups.add(tagGroup);
dao.save(tag);


在这个模型中,则只要:

tagGroup.associate("tags").add(tag);
//或者
tag.associate("tag_groups").add(tag_group);

一句话就完成了。
而这些都是Model自己处理的。不需要借助dao和service.
同理,模型层有自己的校验器和回调机制。这些都是放在model层。
0 请登录后投票
   发表时间:2012-08-08  
ActiveJDBC ???
0 请登录后投票
   发表时间:2012-08-08   最后修改:2012-08-08
href 写道
ActiveJDBC ???

更准确的说,应该是  JActiveRecord 哈哈
0 请登录后投票
   发表时间:2012-08-08  
java 能实现吗?
0 请登录后投票
   发表时间:2012-08-08   最后修改:2012-08-08
yxb1990 写道
java 能实现吗?

当然可以实现。上面的文档就来自一个真实的框架的wiki文档。只是不知道大家对这种模型的接受程度。

比如假设在模型类不定义任何属性(当然你可以定义)。那么就需要一定的语法格式才能取出属性。比如你希望取出tag的name.
通常是:

 tag.getName();


但是如果你没有定义这个属性而是靠框架给你自动生成,那么就需要
 tag.attr("name",String.class);

来获取。

一般而言,这不会造成问题。你很少会有取出属性这种需求。比如form表单填充,模型类已经有相应的方式给你。

  Tag tag = Tag.create(params());


其中 params()会返回一个map对象。任何模型类都有从map对象构建自身的一个功能,通过create() .
所以基本需要你直接设置model或者取出model属性的状况比较少。尤其是一些移动应用后端。



0 请登录后投票
   发表时间:2012-08-08  
allwefantasy 写道
yxb1990 写道
java 能实现吗?

当然可以实现。上面的文档就来自一个真实的框架的wiki文档。只是不知道大家对这种模型的接受程度。

比如假设在模型类不定义任何属性(当然你可以定义)。那么就需要一定的语法格式才能取出属性。比如你希望取出tag的name.
通常是:

 tag.getName();


但是如果你没有定义这个属性而是靠框架给你自动生成,那么就需要
 tag.attr("name",String.class);

来获取。

一般而言,这不会造成问题。你很少会有取出属性这种需求。比如form表单填充,模型类已经有相应的方式给你。

  Tag tag = Tag.create(params());


其中 params()会返回一个map对象。任何模型类都有从map对象构建自身的一个功能,通过create() .
所以基本需要你直接设置model或者取出model属性的状况比较少。尤其是一些移动应用后端。






什么项目? 地址?
0 请登录后投票
   发表时间:2012-08-08  
melin 写道
allwefantasy 写道
yxb1990 写道
java 能实现吗?

当然可以实现。上面的文档就来自一个真实的框架的wiki文档。只是不知道大家对这种模型的接受程度。

比如假设在模型类不定义任何属性(当然你可以定义)。那么就需要一定的语法格式才能取出属性。比如你希望取出tag的name.
通常是:

 tag.getName();


但是如果你没有定义这个属性而是靠框架给你自动生成,那么就需要
 tag.attr("name",String.class);

来获取。

一般而言,这不会造成问题。你很少会有取出属性这种需求。比如form表单填充,模型类已经有相应的方式给你。

  Tag tag = Tag.create(params());


其中 params()会返回一个map对象。任何模型类都有从map对象构建自身的一个功能,通过create() .
所以基本需要你直接设置model或者取出model属性的状况比较少。尤其是一些移动应用后端。






什么项目? 地址?

能否发表下你对这种ORM模型的看法?
0 请登录后投票
   发表时间:2012-08-08  
有点像DTO
如果我的业务逻辑比较发杂,eg:
同时操作多个表呢?怎么保证事务!

0 请登录后投票
   发表时间:2012-08-08  
elan1986 写道
有点像DTO
如果我的业务逻辑比较发杂,eg:
同时操作多个表呢?怎么保证事务!



事务是controller层次的。通常一个Action对应一个事务。这就意味着,多表插入更新删除都是到最后才一次提交给数据库的。

同理 如果你需要嵌套事物,就是你希望即使整个Action失败,但是某些操作仍然需要提交,那么可以使用
类似:

Tag.transaction(new Transaction(){
   public void callback(){
     tag.save();
     tagGroup.save();
}
})

上面代码块是单独的一个事务
其实ORM都有级联操作,默认会级联保存。所以他们应该在一个事务里。
0 请登录后投票
   发表时间:2012-08-08  
想法不错。。。在 基类 Model 中设计了一个小型 DSL。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics