我正在使用 Hibernate (JPA)和 Derby数据库 - 我的应用服务器是 Jboss 6.0 。 我必须预先填充一个包含50000个员工信息的表,为此我使用了一个独立的JDBC程序。 现在,从我的应用程序中,我还需要在同一个表中插入新的员工信息,然后我使用 JPA (因为它在app容器中运行)。
我的Employee类是一个Entity bean,并且“ Id ”列是主键,带有“ @GeneratedValue(strategy = auto)”注释,以便Hibernate找出适当的运行序列号为主键(即Id列)。
现在问题是Hibernate总是从“1”开始运行此序列,即使Employee表已经有条目。因此,当我尝试使用 Entitymanager :: persist() 插入新记录时,我总是得到约束违规错误,例如“在唯一或主键约束或唯一索引中复制键值“。 这是因为hibernate尝试插入 Id = 1 的新条目,因为我在该表中已经有一个Id = 1的条目。
我的问题是
a)如何更新Hibernate'e缓存,以便我可以相应调整“Id”列的运行序列号? 据我所知,它会因数据库而异 - 但是有可能 吗?
b)还有其他方法可以达到同样的目的吗?
c)如果我编写一个独立的JPA程序来进行批量插入(即预填充)然后启动我的Jboss应用程序,那么hibernate是否能够确定正确的“正在运行的串行”没有?
提前感谢任何建议, - kuntal
答案 0 :(得分:2)
a)如何更新Hibernate'e缓存 这样我的运行序列号 “Id”列可以相应地 调整?我知道它会有所不同 从DB到DB - 但它是否可能在 所有?
b)还有其他方法可以实现 一样吗?
您可以使用@TableGenerator生成主键,它根据保持有两个字段tableName&的表中的值生成下一个id。它各自的id&它会在插入后相应更新。
它负责维护正确的序列,你可以修改初始值等。
@TableGenerator(name = "TABLE_GEN", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", pkColumnValue = "PERSON_ID", initialValue = 1, allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
private int id;
c)如果我写一个独立的JPA程序 做批量插入(即前 人口)然后开始我的Jboss 应用程序,将hibernate能够 确定正确的“运行序列” 没有?
最后,为 - 1)应用程序&创建两个生成器。 2)独立程序,使用公共表生成id,因此在唯一或主键约束或唯一索引中没有重复键值。
答案 1 :(得分:0)
为了配置缓存,使用了hibernate.cfg.xml文件。属性标记中的名称必须是hibernate.cache.provider_class才能激活二级缓存。我们可以使用hibernate.cache.use_second_level_cache属性,它允许您激活和停用二级缓存。默认情况下,激活二级缓存并使用EHCache。
软件测试服务