我们的系统中有一个表,用于存储资源键/值对。有两列用于存储值。 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()时根据新值的长度更改其值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top