5

テーブルジェネレーターを使用して主キーを生成しようとします。しかし、テーブルに 6 つのレコードを挿入すると、primaryKey テーブルには値が 1 つだけ表示されます。ここに次のコードがあります

私のエンティティクラス

package com.generatorvaluetest.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.TableGenerator;

@Entity
public class Snufu {
private int autoId;
private int identityId;
private int sequenceId;
private int tableId;
private String name;
public int getAutoId() {
    return autoId;
}
public void setAutoId(int autoId) {
    this.autoId = autoId;
}
public int getIdentityId() {
    return identityId;
}
public void setIdentityId(int identityId) {
    this.identityId = identityId;
}
public int getSequenceId() {
    return sequenceId;
}
public void setSequenceId(int sequenceId) {
    this.sequenceId = sequenceId;
}

@Id
@TableGenerator(name="tg" , table="pk_table", pkColumnName="name" , 
valueColumnName="vlaue" , allocationSize=10)
@GeneratedValue(strategy=GenerationType.TABLE , generator="tg")
public int getTableId() {
    return tableId;
}
public void setTableId(int tableId) {
    this.tableId = tableId;
}

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

これが私のメインクラスです

 package com.generatorvaluetest.main;

 import org.hibernate.HibernateException;
 import org.hibernate.Session;

 import com.generatorvaluetest.domain.Snufu;
 import com.generatorvaluetest.util.HibernateUtil;

 public class GeneratorValueTest {
public static void main(String[] args) throws HibernateException{
    HibernateUtil.recreateDatabase();
    Session session = HibernateUtil.beginTransaction();
    for(int i = 0 ; i< 5 ; i++){
        Snufu snufu = new Snufu();
        snufu.setName("jimmy"+i);
        session.saveOrUpdate(snufu);
    }

    new Thread(new Runnable() {

        @Override
        public void run() {
            Session session = HibernateUtil.beginTransaction();
            Snufu snufu = new Snufu();
            snufu.setName("jimmykalra");
            session.saveOrUpdate(snufu);
            HibernateUtil.commitTransaction();
        }
    }).start();
    HibernateUtil.commitTransaction();
}
  }

データベースでpk_tableから値を選択すると、値は

|name | value|
|snuf | 1    |

しかし、snufu テーブルには 6 つのレコードがあります

4

3 に答える 3

2

@TableGeneratorテーブルに 6 つのレコードが既に挿入されているのに値 1 がテーブルに表示されるのは誤解を招く可能性があります@Entityが、説明は非常に簡単です。でを設定しまし@TableGeneratorallocationSize=10。つまり、Hibernate は 1 から 9 までの ID を事前に割り当てており、9 番目のレコードが@Entityテーブルに挿入されるか、アプリケーションを再起動すると、次に生成される ID は 10 になります ( pk_table.value * allocationSize)。また、ID=10アプリケーションの再起動後の行または次の行が挿入される前にpk_table.valueが 1 増加するため、この次の 10 のチャンクが使い果たされるか、アプリケーションを再起動すると、ID 生成は 20 (2 * 10) で再開されます。

于 2016-09-12T21:00:04.867 に答える
2

の値のvalueColumnNameつづりが、指定されたテーブルと比較して間違っています。また、列 value( ) で識別される、キーを取得するために参照する行についても言及していませんpkColumnValue

以下はサンプル コードです。詳細については、TableGenerator ドキュメントを参照してください。

TableGenerator(name="tg" , table="pk_table", pkColumnName="value" , 
valueColumnName="name" , pkColumnValue = "snuf", allocationSize=10)
于 2012-12-04T10:16:01.957 に答える
0

上記のコードを主キー列の定義に追加します

@TableGenerator(
            name="empGen", 
            table="ID_GEN", 
            pkColumnName="GEN_KEY", 
            valueColumnName="GEN_VALUE", 
            pkColumnValue="EMP_ID", 
            allocationSize=1)


    @Id
    @GeneratedValue(strategy=TABLE, generator="empGen")
    int id;

pkColumnValue フィールドで特定のテーブルを認識するために任意の値を指定できます。

これに関する詳細については、インクhttp://docs.oracle.com/javaee/6/api/javax/persistence/TableGenerator.htmlの下から @TableGenerator のドキュメントを参照してください。

于 2016-05-12T06:19:53.093 に答える