2009-08-26 18 views
2

単一のテーブル継承階層を持つHibernate/JPA環境でPostgreSQLを使用すると、異常な動作が見られます。JPA単一テーブル階層のPostgreSQL ID

まず私の環境:(Glassfishのアップデートツールからインストール)

  • のPostgreSQL 8.3
  • 春2.5.6SEC01
  • 休止-のEntityManager 3.4.0.GA
  • 休止分布3.3.1 .GA(Glassfish更新ツールからインストール)
  • グラスフィッシュV2
  • Mac OS X 10.5.x

GenerationTypeIDENTITYを1つのテーブル継承階層で使用すると問題が発生します。

Child.java

@Entity 
@DiscriminatorValue("Child") 
public class Child extends Parent { 
    private String babyName; 

    /** 
    * @return the babyName 
    */ 
    public String getBabyName() { 
     return babyName; 
    } 

    /** 
    * @param babyName the babyName to set 
    */ 
    public void setBabyName(String babyName) { 
     this.babyName = babyName; 
    } 
} 

DDL

Parent.java

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="generation", discriminatorType=DiscriminatorType.STRING) 
@DiscriminatorValue("Parent") 
public class Parent implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private Long id; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
} 

:ここ

は私の2つのエンティティです

org.postgresql.util.PSQLException: Bad value for type long : Parent 

は私がトレースするログを上げ、これが出力されます:

create table Parent (generation varchar(31) not null 
        ,id bigserial not null 
        ,babyName varchar(255) 
        ,primary key (id) 
        ); 

私は新しい親を挿入しようとすると、私はエラーを取得する私は弁別値を変更した場合

 
TRACE TransactionSynchronizationManager - Bound value [[email protected]] for key [[email protected]] to thread [httpSSLWorkerThread-8080-0] 
Hibernate: insert into Parent (generation) values ('Parent') 
SQL Error: 0, SQLState: 22003 
Bad value for type long : Parent 
TRACE TransactionInterceptor - Completing transaction for [com.xxx.yyy.service.MoveService.saveHuman] after exception: javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not insert: [com.xxx.yyy.temp.Parent] 
TRACE RuleBasedTransactionAttribute - Applying rules to determine whether transaction should rollback on javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not insert: [com.xxx.yyy.temp.Parent] 

長いものとして解析するもの123挿入が成功します。しかし、Hibernateはこの弁別子の値がIDだと思っているようです。したがって、次のコード:

Parent p = new Parent(); 
service.saveHuman(p); 

add(new Label("p", "p id is" + p.getId())); 

は、私がAUTOに生成タイプを変更する場合は、単一のシーケンスが作成され、インサートが動作しているようですさ123としてではなく、1

ある主キーの値のIDを表示しますOK。私はそれをSEQUENCEに変更し、クラスレベルの注釈でシーケンスを再度宣言しても動作します。しかし、私が読んだドキュメントによると、PostgreSQLは両方の世代型をサポートしています。

私も同じコードを試して、MySQL 5.0.51bを使ってデータベースを切り替えました。これはうまく機能しているようです。

これは私のコード、ダイアレクト、Hibernate、PostgreSQL JDBCドライバのバグですか?どのように私は問題を絞り込むことができます任意のアイデア?誰かがこの問題を再現できるようになりました。私は検索しようとしましたが、この正確な問題はまだ見ていませんでした。

注:私はHibernate Forumsの質問もしました。当然私は両方のサイトへの応答をフィードバックします。

+0

どのバージョンのPostgreSQL JDBCドライバを使用していますか? –

+0

これはpostgresql-8.4-701.jdbc4.jarです。それは良い点です。違いがあるかどうかを確認するために別のバージョンを試してみます。 – Stephen

+0

@Matt Solnitちょうどpostgresql-8.3-605.jdbc4を試してみました。どうもありがとう。あなたがこれを答えとして書いておきたいなら、私はそれをあなたに割り当てます。 – Stephen

答えて

1

私は上記のコメントからこのソリューションを "移植"しています... PostgreSQL JDBCドライバのバージョン8.3を使用してください:-)。

関連する問題