dayatang / dddlib

A DDD (Domain Driven Design) Library, derived from the idea of Eric Evans' book: 'Domain-Driven Design: Tackling Complexity in the Heart of Software'
Apache License 2.0
652 stars 279 forks source link

AbstractEntity类的问题 #2

Closed 0xbillw closed 10 years ago

0xbillw commented 10 years ago

AbstractEntity作为DDD的基类,在使用时我发现了的几个问题:

  1. 如果我的的ID不是LONG类型, 无法扩展修改
  2. 如果我的继承策略是TABLE_PER_CLASS, 则会报异常: "Cannot use identity column key generation with mapping for". 原因是由于ID的生成策略被设置为AUTO, TABLE_PER_CLASS继承策略不允许. 但由于注解的位置在字段,所以无法override该ID的生成策略.
  3. 第二个问题可以通过继承id getter setter并abstract,再通过具体类在getter上override id的生成策略
  4. 实际使用时会由于多态、重写方法的注解,会使注解的位置混乱,可能导致的未知问题。hibernate推荐把注解统一写在getter上。
dayatang commented 10 years ago

感谢你的关注。 1、针对第一个问题,我准备提供一个不提供ID字段的基类。同时需要说明的是:我提供AbstractEntity这个基类只是一种便利设施,但是不要求所有的实体类都从这个基类继承。推荐的方式是实现Entity接口。考虑到DDD“聚合”的概念,理论上,只有聚合根才能够写数据库,非聚合根实体拥有save()、remove()等方法可能会打破聚合所要求实现的业务规则的不变性。 2、推荐的实体继承策略是单表策略。TABLE_PER_CLASS方式不支持倒是没有考量到。 3、多谢指教,指出持久化注解该写在getter上。以前没考虑过这个问题。我们的项目中已经有很多类是继承自AbstractEntity,所以已经难以修改了。我打算提供另一个实体基类来纠正这个问题。