Frage

Wir haben eine Tabelle in unserem System, in der Ressourcenschlüssel / Wert-Paare gespeichert sind. Es gibt zwei Spalten zum Speichern des Werts. eine VARCHAR-Spalte für kleinere Werte und ein CLOB für größere Werte. Auf der Java-Seite werden sie in eine von zwei Klassen instanziiert, einen StandardResourceBundleValue oder einen LargeResourceBundleValue, und eine Diskriminatorspalte wird verwendet, um sie in einer Tabelle zu unterscheiden:

<discriminator type="string">
    <column name="RESOURCE_TYPE" length="20" index="XIE1CPD_RESOURCE_BUNDLE_L_V"/>
</discriminator>
...
<subclass name="StandardResourceBundleValue" discriminator-value="STANDARD">
    <property name="messageValue" type="string" column="STD_MSG_VALUE" length="400"/>
</subclass>
<subclass name="LargeResourceBundleValue" discriminator-value="LARGE">
    <property name="messageValue" type="materialized_clob" column="LARGE_MSG_VALUE"/>
</subclass>

Hier ist der lustige Teil: Wenn der Wert eines Schlüssels klein anfing (und als StandardResourceBundleValue beibehalten wurde), ändert sich der Wert in einen Wert, der größer als der VARCHAR ist, und wir müssen ihn in einen StandardResourceBundleValue konvertieren. Der Code, in dem dies geschieht, kann nicht einfach den StandardResourceBundleValue löschen und einen LargeResourceBundleValue erstellen, da dies zu Verstößen gegen Einschränkungen führt.

Wir möchten eine Eigenschaft für diese Diskriminatorspalte definieren, damit die Basisklasse eine Methode haben kann, die diesen Wert im Objekt ändert. Wenn er also erneut beibehalten wird, wird der Wert im CLOB gespeichert.

<property name="resourceType" type="string">
    <column name="RESOURCE_TYPE"/>
</property>    

Wenn ich versuche, die Tabelle zu erstellen, wird die folgende Fehlermeldung angezeigt:

Wiederholte Spalte in der Zuordnung für Entität: com.foo.resourcebundle.LargeResourceBundleValue-Spalte: RESOURCE_TYPE (sollte mit insert="false" update="false" zugeordnet werden)

Natürlich versteht es nicht, was ich versuche, aber es macht Sinn, dass es einen Weg geben sollte, es zu tun. Wie können Sie ein Diskriminatorfeld als Eigenschaft verfügbar machen?

Danke.

War es hilfreich?

Lösung

Das kannst du nicht machen.Ein Objekt hat einen Typ und kann nicht von einem Typ zu einem anderen wechseln.So funktioniert Java.

Ich denke, Sie sollten hier einfach nicht zwei Arten von Entitäten haben.Warum speichern Sie den Diskriminator nicht einfach als einfache Aufzählungsspalte und speichern / holen den Wert der Eigenschaft in der varchar- oder clob-Spalte basierend auf dem Wert dieser Aufzählung.Stellen Sie sicher, dass alles transparent in das Objekt eingekapselt ist und auch für Anrufer alles einfacher wird.Das Enum-Feld konnte nicht einmal veröffentlicht werden.Sie verwenden es, um getMessageValue() zu implementieren (rufen Sie den Wert aus der entsprechenden Spalte ab), und Sie ändern seinen Wert, wenn setMessageValue() aufgerufen wird, basierend auf der Länge des neuen Werts.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top