从类比中吸取了完全错误的教训,我花了几年时间寻找完美的 ORM,无论是通过我自己的决策还是其他人的决策,我都接触到了名副其实的环法自行车赛:Python、Active Record、Linq 中的 Django 和 SQLAlchemy, Hibernate、实体框架,以及最近在 Bridge Financial Technology 的 Golang 支持的后端中的 Gorm。
对于PO中为了某种持久化策略而存在的属性,例如version,由于DO、PO合并了,必须在DO中声明,但由于这个属性对DO是没有任何业务意义的,需要让该属性对外隐藏起来,最常见的做法是把该属性的get/set方法私有化,甚至不提供get/set方法,但对于Hibernate来说,这需要特别注意,由于Hibernate从数据库读取数据转换为DO时,是利用反射机制先调用DO的空参数构造函数构造DO实例,然后再利用JavaBean的规范反射出set方法来为每个属性设值,如果不显式声明set方法,或把set方法设置为private,都会导致Hibernate无法初始化DO,从而出现运行时异常,可行的做法是把属性的set方法设置为protected。