hibernate 自定义类型解决方案[不良方案]
public String getPowerSetString() {if (this.powerSetString==null) {return casePowerSetToString();}return powerSetString;}public void setPowerSetString(String powerSetString) {this.powerSetString = powerSetString;}public Set<Power> getPowerSet() {if (powerSet==null) {powerSet=caseStringToPowerSet();//如果不存在powerSet则使用String转化}return powerSet;}public void setPowerSet(Set<Power> powerSet) {this.powerSet = powerSet;}public void setPowerSet(String powerString) {this.powerSet = caseStringToPowerSet(powerString);}
这就实现了可以实现powerSetString的对外透明,而还是提供powerSet对外
小总结:
对于自定义类型,虽然hibernate帮助我们,但是,我们完全可以自己提供转接的属性和方法,让自定义类型对hibernate透明,并提供变异的getter和setter,实现转换属性对外的透明,从而让pojo正常使用
此例是使用了enmu的特性,看似特例,其实不然,我们还有java.sql.Types帮我们是实现自定义类型的转换
关键是思考如何将自定义类型比较合适的分解成普通类型,并组合后能够送入数据库,最坏的打算是将对象序列化,二进制写入了.
后生愚昧,望智者提点
1 楼 Norther 2008-10-25 你都用hibernate实现ORM了,已经被侵入的死死的了,还害怕依赖Hibernate的API?这种方式和实体类绑定太死,如果我有N个类都有PowerSet这样的需要特殊持久化方式的属性,那我得写N个get set,也就处理一下fistname+lastname之类的简单情况还行,稍微复杂点的还是得上UserType,UserType就几个方法,一点也不麻烦,看看Hibernate的java doc,上面写的清清楚楚。 2 楼 黑猪王子 2008-10-27 我个人觉得还是要看具体情况,就我目前的情况来说,这样实施还是很便利的.
而且UserType我还是觉得麻烦了些,还有hashCode这些个东西,通过我上面的方案跳过还是比较快捷的.
谢谢你的指点了 3 楼 黑猪王子 2008-11-13 恩 实践证明 这是不良方案,维和以及操作确实很麻烦,不如交给hibernate来做了
正如Norther 说的, 谢谢提点了