2017-01-18 7 views
1

OracleデータベースでHibernateとJPAを使用する方法を学習しようとしています。HibernateでOracleのID列にシーケンスを使用すると、奇妙な(負の)値が生成される

これは、私がこれまで持っていたものです。

表および配列宣言

CREATE TABLE MESSAGE(ID INTEGER NOT NULL PRIMARY KEY, 
         Text VARCHAR2(255) NOT NULL); 

CREATE SEQUENCE Message_Seq START WITH 1 INCREMENT BY 1; 

hibernate.cfg.xmlの

<hibernate-configuration> 
<session-factory> 

    <!-- Database connection settings --> 
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
    <property name="hibernate.connection.password">tbi</property> 
    <property name="hibernate.connection.url">jdbc:oracle:thin:@LHT:3100/LHT0</property> 
    <property name="hibernate.connection.username">tbi</property> 
    <property name="hibernate.default_schema">tbi</property> 

    <!-- SQL dialect --> 
    <property name="hibernate.dialect">org.hibernate.dialect.Oracle8iDialect</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">true</property> 

    <!-- Mapping class --> 
    <mapping class="entity.Message"/> 
</session-factory> 

エンティティクラス

package entity; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.SequenceGenerator; 
import javax.persistence.Table; 

@Entity 
@Table(name = "message") 
public class Message { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_Sequence") 
    @SequenceGenerator(name = "id_Sequence", sequenceName ="Message_Seq") 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "TEXT") 
    private String text; 

    public Message() { 
    } 

    public Message(String text) { 
     this.text = text; 
    } 

    @Override 
    public String toString() { 
     return "Message [id=" + id + ", text=" + text + "]"; 
    } 

} 

私はこれを実行すると、最初の時間は、私は、コンソールでのSQL出力としてこれを参照してください

package client; 

import org.hibernate.Session; 
import util.HibernateUtil; 
import entity.Message; 

public class HelloWorldClient { 

    public static void main(String[] args) { 

     Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 

     Message message = new Message("Hello, World!"); 

     session.save(message); 

     session.getTransaction().commit(); 
     session.close(); 

} 

}

Clientクラス:

Hibernate: select tbi.Message_Seq.nextval from dual 
Hibernate: select tbi.Message_Seq.nextval from dual 
Hibernate: insert into tbi.message (TEXT, ID) values (?, ?) 

注どのシーケンスコールは2回実行されます。

表は次のようになります。私は私の例秒の時間を実行した場合

SELECT * 
FROM MESSAGE; 

ID Text 
-- ------------- 
1 Hello, World! 

SELECT Message_Seq.NEXTVAL 
FROM DUAL; 

NEXTVAL 
------- 
3 

、私はこのコンソール出力を参照してください。シーケンスの呼び出しが一度どのように行われるか

Hibernate: select tbi.Message_Seq.nextval from dual 
Hibernate: insert into tbi.message (TEXT, ID) values (?, ?) 

注意。

SELECT * 
FROM MESSAGE; 

ID Text 
--- ------------- 
1 Hello, World! 
-45 Hello, World! 

SELECT Message_Seq.NEXTVAL 
FROM DUAL; 

NEXTVAL 
------- 
5 

nextvalは正しくカウントされますが、-45はIDとしてどこにありますか?

これは、そこから延々と続く:

ID Text 
--- ------------- 
1 Hello, World! 
-43 Hello, World! 
-44 Hello, World! 
-45 Hello, World! 

は正直に言うと、私は現時点では完全に混乱しています。

+1

JPA APIを使用していません。それがHibernate APIです! –

+1

以下を参照してください。 http://stackoverflow.com/questions/9861416/hibernate-generates-negative-id-values-when-using-a-sequence – TechEnthusiast

答えて

0

コメントでTechEnthusiastのヒントがトリックでした。

はあなたのHibernate設定に

<property name="hibernate.id.new_generator_mappings">false</property> 

を設定しても、Oracleデータベース上で、あなたの順序を設定したように、電子をシーケンスをインクリメントする冬眠伝える必要があります。 g。あなたは、データベースのDDLで

INCREMENT BY 1 

を設定した場合、あなたは、エンティティBeanのご@SequenceGenerator注釈で相応

allocationSize=1 

を必要としています。

関連する問題