将鉴别符列作为hbm文件中的属性公开
-
27-10-2019 - |
题
我们的系统中有一个表,用于存储资源键/值对。有两列用于存储值。 VARCHAR列表示较小的值,CLOB表示较大的值。在Java方面,它们被实例化为两个类之一,StandardResourceBundleValue或LargeResourceBundleValue,并且在一个表中使用discriminator列来区分它们: 通用标签
这是一个有趣的部分:如果键的值开始很小(并以StandardResourceBundleValue的形式存在),那么该值将变为比VARCHAR大的值,我们需要一种将其转换为StandardResourceBundleValue的方法。发生这种情况的代码不能只删除StandardResourceBundleValue并创建LargeResourceBundleValue,因为这会导致约束冲突。
我们要做的是为该鉴别符列定义一个属性,以便基类可以具有一种更改对象中该值的方法,因此当再次保留该值时,该值将保存在CLOB中。 通用标签
当我尝试建立表时,出现以下错误:
实体映射中的重复列: com.foo.resourcebundle.LargeResourceBundleValue列: RESOURCE_TYPE(应使用insert=“ false” update=“ false”映射)
很显然,它不理解我要做什么,但是有意义的是应该有一种方法可以做到。那么,如何将鉴别符字段公开为属性?
谢谢。
解决方案
您不能那样做。对象具有类型,并且不能从一种类型切换到另一种类型。这就是Java的工作方式。
我认为您不应该在这里拥有两种类型的实体。为什么不只将鉴别符存储为基本枚举列,然后根据该枚举的值在varchar或clob列中存储/获取属性的值。确保所有内容都被透明地封装到对象中,并且即使对于调用者而言,所有内容都将变得更加容易。枚举字段甚至无法公开。您可以使用它来实现getMessageValue()
(从相应的列中获取值),并在调用setMessageValue()
时根据新值的长度更改其值。