状态模式和没有枚举的休眠状态>>

问题描述 投票:2回答:2

[我使用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]]

java hibernate design-patterns reflection state-pattern
2个回答
0
投票

假设您使用MySQL作为数据库来存储您的枚举,则枚举值存储为数字而不是字符串。因此,与使用整数FK相比,您不要通过使用枚举丢失空间

。参见How Does MySQL Store Enums?

0
投票

休眠映射可以是:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.