[我使用Hibernate搜索了Java中State模式的实现,并找到了一些使用Enums解决方案的参考,以提供一种灵活的方法来向情况添加新状态。
我喜欢这里的解决方案,其中反射用于根据保存了ConcreteState类名称的表字段“ state”的值创建状态对象:http://nerdboys.com/2007/06/08/state-pattern-persistence-with-hibernate/
但是不建议使用此解决方案,因为在DB中保存com.myCompany.myProject.asdasd.ConcreteState类型的String值与保留整数值相比会浪费空间。所以我想知道是否有一种方法可以将可能的状态保存在一个表中,如:
customer_states(PK id INT,className VARCHAR)
并修改我的客户表以使状态变为FK,例如:
客户(PK ID INT,名称VARCHAR,FK状态INT)
因此,我将不会使用超过需要的磁盘空间,并且将保持客户状态的一致性,因此很容易在情况中添加新状态...但是,您将如何在UserType中实现呢? ?
谢谢!
[我使用Hibernate搜索了Java中State模式的实现,并找到了一些使用Enums解决方案的引用,以提供一种灵活的方法来向...添加新的States]]
假设您使用MySQL作为数据库来存储您的枚举,则枚举值存储为数字而不是字符串。因此,与使用整数FK相比,您不要通过使用枚举丢失空间
。参见How Does MySQL Store Enums?休眠映射可以是:
<property name="_Status">
<column name="STATUS" sql-type="NUMBER" not-null="true"/>
<type name="GenericEnumUserType">
<param name="enumClass">Status</param>
<param name="identifierMethod">getCode</param>
<param name="valueOfMethod">fromString</param>
</type>
</property>