JPAでシーケンス

コメントであったテーブルにシーケンスを使ってエンティティは「@GeneratedValue(strategy=IDENTITY)」でとあったので再トライ。
というか、前のエントリで書いたのはすでにこの方法は試してたんだけどだめだったからで。

テストテーブルを作る

CREATE TABLE TEST ( 
  ID INT AUTO_INCREMENT PRIMARY KEY, 
  NAME VARCHAR(255) 
);

エンティティを生成

HibernateToolから自動生成した

package struts2.sample.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity @SuppressWarnings("serial")
@Table(name = "TEST")
public class Test implements java.io.Serializable {

    private Integer id;
    private String name;

    public Test() {
    }

    public Test(String name) {
        this.name = name;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "ID", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

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

    @Column(name = "NAME")
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

手を加えたのは「@SuppressWarnings("serial")」を入れただけ。
自動生成した時点で「@GeneratedValue(strategy = IDENTITY)」は付加されてた。

Daoクラスにメソッド追加

@Override
public void testAdd() {
  Test entity = new Test();
  entity.setName("hoge");
  getJpaTemplate().persist(entity);
}

SpringのJpaDaoSupportを利用。
わすれずにpersistence.xmlFQCNを追加。

実行

javax.servlet.ServletException: 
Internal Exception: org.h2.jdbc.JdbcSQLException: シーケンス SEQ_GEN_SEQUENCE が見つかりません
Sequence SEQ_GEN_SEQUENCE not found; SQL statement:
CALL NEXT VALUE FOR SEQ_GEN_SEQUENCE [90036-69]
    at org.h2.message.Message.getSQLException(Message.java:91)

とまぁ、これがでて動かないと。

まとめ?

んなわけで、シーケンスが見つからないとかいわれたので、しかたなくEntity側でシーケンス指定してテーブルにも作ってみたと。
それか、SEQ_GEN_SEQUENCEを先に作っておけていうこと?なんかそれも違う気がするんだけど…。
DB詳しくないからなぁ。
そもそもToplinkJPA実装にプロバイダとしてH2が(使ってるJarには)なくて、H2から提供されてるプロバイダを使ってたり。
なんかこの辺のしがらみがなんかありそう?
H2側で勝手に作成されたシーケンスはSYSTEM_SEQUENCE_xxxxxxみたいなのがあるわけだが…。