2

JPA(正確にはEclipseLink)でマップしようとしているレガシーMS SQL Server 2000データベースがあります。

「連絡先」または「資産」のいずれかになるテキストフィールド「KEY1」を持つテーブル「CONTACT1」があり、次を使用しています。

@Table(name = "CONTACT1")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "KEY1")
public abstract class Record {

2 つの異なるクラス (Contact と Asset) にマップします。

@Entity
@DiscriminatorValue(value = "Contact")
public class Contact extends Record {...}

@Entity
@DiscriminatorValue(value = "Asset")
public class Asset extends Record {...}

残念ながら、一部のレコードまたはレコードが欠落していることがわかりました。さらに分析した結果、一部の連絡先レコードの「KEY1」フィールドが NULL に設定されていることがわかりました。

更新クエリを実行して問題を修正することはできますが、それを避けたいのですが、その「NULL」値を Contact クラスにマップする方法はありますか?

それができない場合、JPAにレコードセットを事前にフィルタリングして、フィールドがNULLではないが「連絡先」が書き込まれていると信じさせるメカニズムはありますか?

4

2 に答える 2

0

更新を実行し、データベース内の null 値を持つ行に正しい値を割り当てる必要があります。また、データベースの列定義を変更し、デフォルト値を設定して、将来 null が発生しないようにすることもお勧めします。

または使用しないでください@DiscriminatorColumn。私の経験では、価値がある以上に複雑さとバグを追加する傾向があります。

于 2012-11-08T14:23:34.277 に答える
0

明確化: @DiscriminatorColumn アノテーションを任意の列 (ここでは KEY1 など) に設定すると、Hibernate ORM は NOT NULL 制約を持つデータベース スキーマを作成することがわかりました。レガシー DB には null 値があるため、NULLABLE にするための ALTER テーブルが後で発行された可能性があります。詳細: https://hibernate.atlassian.net/browse/HHH-12445

解決策 1: Discriminator 式を使用して、null 値を優先エンティティ クラスにマップできます。

@DiscriminatorFormula("case when key1 is null then 'Contact' else key1 end)
@DiscriminatorValue(value = "Contact")

https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.htmlの例 247に注意してください。

解決策:2 @DiscriminatorColumn("null") を使用して、その行を "Contact" エンティティ クラスにマップすることもできます。 https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance-discriminator-implicit例 254

于 2021-06-14T11:24:33.057 に答える