単一のテーブル継承階層を持つ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
GenerationType
のIDENTITY
を1つのテーブル継承階層で使用すると問題が発生します。
@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の質問もしました。当然私は両方のサイトへの応答をフィードバックします。
どのバージョンのPostgreSQL JDBCドライバを使用していますか? –
これはpostgresql-8.4-701.jdbc4.jarです。それは良い点です。違いがあるかどうかを確認するために別のバージョンを試してみます。 – Stephen
@Matt Solnitちょうどpostgresql-8.3-605.jdbc4を試してみました。どうもありがとう。あなたがこれを答えとして書いておきたいなら、私はそれをあなたに割り当てます。 – Stephen