1

プレイ!フレームワークとそれは JPASupport クラスです。レガシー データベースで問題が発生しました。

私は次のクラスを持っています:

@Entity
@Table(name="product_catalog")
public class ProductCatalog extends JPASupport {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer product_catalog;

    @OneToOne
    @JoinColumn(name="upper_catalog")
    public ProductCatalog upper_catalog;

    public String name;
}

一部の製品カタログには上位カタログがなく、これは従来のデータベースでは 0 として参照されます。upper_catalog を NULL として指定すると、JPA はそのデータベース列に NULL 値を挿入すると予想されます。データベースへの書き込み時に null 値を強制的に 0 に、データベースからの読み取り時に null 値を強制的に 0 にするにはどうすればよいですか?

4

2 に答える 2

2

JPAであなたが望むものを直接達成する簡単な方法はわかりません(そして、保存や読み込みなどの基本的な操作で機能する方法を見つけたとしても、より複雑なユースケースでは機能しない可能性が高いです.複雑な基準 / hql、非標準フェッチ モードなど)

だから私はそれをします:

@Entity
@Table(name="product_catalog")
public class ProductCatalog extends JPASupport {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer product_catalog;

    @Column(name="upper_catalog")
    public Long upper_catalog_id;

    public String name;

    public ProductCatalog getUpperCatalog() {
       if (upper_catalog_id == 0)
         return null;

       return ProductCatalog.findById(upper_catalog_id);
    }

    public void setUpperCatalog(ProductCatalog pc) {
       if (pc == null) {
         upper_catalog_id = 0;
       }
       else {
         if (pc.id == null) {
            // option 1. a bit like a cascade
            pc.save();
            // option 2. if you consider passing a transient entity is not valid
            throw new RuntimeException("transient entity " + pc.toString());
         }
         upper_catalog_id = pc.id;
       }
    }
}
于 2010-06-07T11:43:55.633 に答える
0

2 つのオプションが表示されます。

  • プリミティブ データ型をId(つまりintの代わりにInteger)使用する
  • Hibernate を JPA プロバイダーとして使用している場合は、aCustomTypeを使用して変換を行います。
于 2010-06-07T14:32:38.933 に答える