这部分的代码在
http://git.oschina.net/terrymanu/miracle-framework/tree/master/miraclesea/framework-dao
之前写DAO,都是定义一个泛型的BaseDao,然后写入基本的CRUD,其他的业务DAO都继承这个类。自从有了Spring Data JPA,这个BaseDao就不需要了,直接使用就行了。
Spring Data JPA基本提供所需的方法,对于业务查询,也可以通过接口+Query的方式使用。另外它还贴心的提供了AbstractPersistable和AbstractAuditable,用于生成主键和审计信息。但是这个AbstractPersistable主键的生成方式貌似只支持自增主键,想用UUID好像没什么办法。
这样的话,这个包里就不需要代码了。但是我考虑把DataSource,JPA以及Transaction等和数据库相关的配置文件放在这个包里。虽然目前没有什么代码,但是不排除以后根据业务需要增加公用代码的可能,比如根据Projection部分读取字段。
突然发现AbstractPersistable不能设置@version的乐观锁。所以还是定义了AbstractOptimisticLockPersistable以及AbstractOptimisticLockAuditable类。
目前还有一些没想太明白的事情。
1. Entity主要用于关系型数据库和Java对象的映射,Entity是否只在DAO层使用,而在Service层和MVC层另定义对象。还是将Entity贯穿于整个系统架构。
2. 如果贯穿于整个系统架构,Entity是否需要定义一个接口,叫Model之类的,然后各个层只使用这个接口。我看有的系统是这样做的,如activiti,定义Task接口和TaskEntity实现类。
3. 是否需要实现Serialize接口。其实还是这个纠结的老问题,如果Entity只在DAO层使用,就没必要实现Serialize,如果在各层之间传输,则有必要实现。
既然单独的一个DAO模块,免不了将@Entity分散在各个模块中。这样JPA的persistence.xml文件和@Entity类必然不在一个jar包,会导致JPA容器找不到@Entity。解决此问题的方法参见下面
这篇文章
想把结构讨论的清晰一些,希望各位能提些意见,多谢。
来源:oschina
链接:https://my.oschina.net/u/719192/blog/169876