我将尝试使用表生成器生成主键。但是当我在我的表中插入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条记录
答案 0 :(得分:2)
与指定的表格相比,valueColumnName
的值被拼错了。还没有提到引用键的哪一行,由列值(pkColumnValue
)标识。
以下是示例代码&amp;可以参考TableGenerator
documentation,以供进一步参考。
TableGenerator(name="tg" , table="pk_table", pkColumnName="value" ,
valueColumnName="name" , pkColumnValue = "snuf", allocationSize=10)
答案 1 :(得分:2)
在@TableGenerator
表格中看到值1时可能会产生误导,而在@Entity
表中已经插入了6条记录,但解释非常简单。
您已使用@TableGenerator
设置allocationSize=10
。这意味着:Hibernate已经预先分配了1到9的ID,一旦第9条记录插入到@Entity
表中,或者重新启动应用程序,下一个生成的ID将为10(pk_table.value * allocationSize
)。此外,在插入ID=10
的行或应用程序重新启动后的下一行之前,pk_table.value
增加1,因此当下一个10的块耗尽或再次重新启动应用程序时,ID生成将恢复时间为20(2 * 10)。
答案 2 :(得分: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字段中的特定表。
有关此内容的更多信息,请参阅@TableGenerator的文档 从墨水以下 http://docs.oracle.com/javaee/6/api/javax/persistence/TableGenerator.html