我搜索了使用 Hibernate 在 Java 中实现状态模式的方法,并找到了一些对使用枚举的解决方案的引用,以便提供一种灵活的方式来向这种情况添加新状态。
我喜欢这里的解决方案,其中反射用于根据保存 ConcreteState 类名的表字段“state”的值创建状态对象:http://nerdboys.com/2007/06/08/state-pattern-persistence-with-hibernate/
但是这个解决方案不被鼓励,因为在数据库中保存 com.myCompany.myProject.asdasd.ConcreteState 类型的字符串值会浪费空间,与保存整数值相反。所以我想知道是否有一种方法可以将可能的状态保存在一个表中,例如:
customer_states(PK id INT,className VARCHAR)
并修改我的客户表,以便对状态有 FK,例如:
客户(PK id INT,名称 VARCHAR,FK 状态 INT)
所以我不会使用比需要更多的磁盘空间,并且我会保持客户状态的一致性,以便很容易向情况添加新状态...但是,您将如何在您的 UserType 中实现它? ??
谢谢!
最佳答案
假设您使用 MySQL 作为数据库来存储您的枚举,枚举值存储为数字而不是字符串。因此,与使用整数 FK 相比,您不会因使用枚举而丢失空间。参见 How Does MySQL Store Enums?
枚举很优雅,因为与创建另一个表然后通过 FK 引用它相比,它们易于使用。如果他们引用应用程序逻辑,最好将它们作为模式/程序的一部分,而不是作为数据的一部分(即表中的行)。参见 http://www.databasesandlife.com/mysqls-enum-datatype-is-a-good-thing/
请参阅此处了解如何使用 Hibernate 枚举。 (我希望这更容易,我不明白为什么 Hibernate 不支持开箱即用的枚举)。 http://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn
关于java - 没有枚举的状态模式和 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4124240/