java - 没有枚举的状态模式和 hibernate

标签 java hibernate design-patterns reflection state-pattern

我搜索了使用 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/

相关文章:

generics - 使用泛型进行对象转换

java - Android MediaPlayer : error (1, -2147483648) 从字符串变量引用时

java - REST最佳实践,用于检索元素的特定子集

java - 已建立的连接上的 TLS

java - 为什么session.setFlushMode(FlushMode.MANUAL);之后数据存入数据库 session .保存(); ( hibernate )

java - JPA Hibernate Lazy 多对一获取代理

java - 无法创建 bean 抛出异常 Autowiring 依赖项注入(inject)失败,无法 Autowiring 字段

javascript - 多个连续ajax请求的jquery模式

java - 在订阅者线程中调用 Thread.Sleep 会导致发布者线程 hibernate

java - 下面这段代码的空间复杂度?