【问题标题】:@TableGenerator : how to use@TableGenerator:如何使用
【发布时间】:2012-11-21 04:38:08
【问题描述】:

我将尝试使用表生成器生成主键。但是当我在我的表中插入 6 条记录时,primaryKey 表只显示一个值。这是以下代码

我的实体类

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 条记录

【问题讨论】:

  • 我不确定您的代码是否正确。
  • 但我的代码已成功运行,其他技术如 AUTO 、 TabelGenerator 、 Identity 在此代码中成功运行。

标签: java hibernate annotations


【解决方案1】:

valueColumnName 的值与指定的表相比拼写错误。也没有提到要引用哪一行来获取键,由列值标识(pkColumnValue)。

下面是示例代码&可以参考TableGeneratordocumentation,供进一步参考。

TableGenerator(name="tg" , table="pk_table", pkColumnName="value" , 
valueColumnName="name" , pkColumnValue = "snuf", allocationSize=10)

【讨论】:

    【解决方案2】:

    @TableGenerator 表中看到值 1 可能会产生误导,而 @Entity 表中已经插入了 6 条记录,但解释很简单。 您已经使用allocationSize=10 设置了您的@TableGenerator。这意味着:Hibernate 已经预先分配了从 1 到 9 的 ID,并且一旦将第 9 条记录插入到您的@Entity 表中或者您重新启动应用程序,下一个生成的 ID 将是 10 (pk_table.value * allocationSize)。此外,在插入带有ID=10 的行或应用程序重新启动后的下一行之前,pk_table.value 会增加 1,因此当下一个 10 块用完或您再次重新启动应用程序时,ID 生成将在 20 ( 2 * 10)。

    【讨论】:

      【解决方案3】:

      将此代码放在您的主键列定义中

      @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 字段中的特定表。

      关于这方面的更多信息,请参阅@TableGenerator 的文档 从下面的墨水 http://docs.oracle.com/javaee/6/api/javax/persistence/TableGenerator.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-08
        相关资源
        最近更新 更多