2016-06-13 10 views
0

私は、postgressデータベース内のテーブルであるクラスを持っています。クラスは、他のクラスによって拡張されます。メインクラスは、トップhibernateが次のシーケンス値を取得できませんでした

@Inheritanceで次の注釈(戦略= InheritanceType.TABLE_PER_CLASS)

@Entity 
@Table(name="policy_action") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class PolicyAction { 


    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    @Column(name="id") 
    private int id; 
    ..... 

次のエラーがスローさ

public class myspecialPolicy extends policy { 
    .... 
} 

データベースに挿入する第二のクラスを有しています

org.postgresql.util.PSQLException:ERROR:relation "hibernate_sequence"が存在しません

この問題を解決する方法がわからない場合は、事前に感謝の意を表します。

+0

実際に値を生成するためにシーケンスを使用していますか?または、自動数値フィールドを使用していますか? –

答えて

0

何私の問題を解決することは、長いnxt_val列でhibernate_sequenceテーブルを作成しました。私のデータベースのデータ型。

SQLのCreate hibernate_sequence(nxt_val long);

、次いで

Insert into hibernate_sequence (nxt_val) values ('12')NB値は、任意の数とすることができます。

これで、hibernateはnxt_valの値を選択し、何も指定しないでシーケンス生成を決定します。 TableGenerator、Sequence、Auto

0

にHibernateのバージョンに依存し、これらのマッピングの1つは、あなたの最近の休止状態のバージョン(4.3以降)で

@Column(name = "id", columnDefinition = "serial") 
@Generated(GenerationTime.INSERT) 
private int id; 

を助けることができる、あなたはこれを使用することができます:あなたが使用している場合

@Id 
@Column(name = "id") 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int id; 
+0

継承のためにそれを得ることができません。最初のアプローチのためのテーブル –

2

をシリアル値:

@Entity 
@Table(name="policy_action") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class PolicyAction { 


    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genName") 
    @SequenceGenerator(name="genName", sequenceName="yourSequenceNameInDatabase",initialValue=1,allocationSize=1) 
    @Column(name="id") 
    private int id; 

テーブル戦略を使用する場合は、 (例えば、テーブル名のseqNameと値、およびsequenceTable、)2列の表と、この操作を行います。

@Entity 
@Table(name="policy_action") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class PolicyAction { 


    @Id 
    @GeneratedValue(strategy=GenerationType.Table,generator="genName") 
    @TableGenerator(name="genName", table="sequenceTable", pkColumnName="seqName",valueColumnName="value",pkColumnValue="policyAction",initialValue=1,allocationSize=1) 
    @Column(name="id") 
    private int id; 
+0

私はどのように各テーブルがそれ自身のシーケンス名を持つようにするかわからないので、どのように私はそれを上書きしますか?サブクラス? –

+0

それがうまくいくかどうかは分かりませんが、idプロパティではなくgetId()メソッドで '@Id'と '@Column'を使用して、各クラスのIDジェネレータを再定義することができます。 –

+0

追加情報:GenerationType.Tableは、どのSGBDでも移植可能なので、使用することをお勧めします。SequenceGeneratorを使用してPostgreSQLをSQLServerに移行する必要があるときに問題が発生しました。シーケンスからテーブルに切り替えることができました。 –

関連する問題