我正在使用hibernate和spring,h2和liquibase,我试图通过这篇博客文章的例子为我的实体制作一个自定义的String id生成器,但我得到了一个错误:Caused by: org.hibernate.id.IdentifierGenerationException: Unknown integral data type for ids : java.lang.String
下面是我的SequenceStyleGenerator代码:
public class CTCIDGenerator extends SequenceStyleGenerator {
@Override
public Serializable generate(SessionImplementor session, Object obj) {
if (obj instanceof Identifiable) {
Identifiable identifiable = (Identifiable) obj;
Serializable id = identifiable.getId();
if (id != null) {
return id;
}
}
return "CTC"+super.generate(session, obj);
}
}
我的实体代码:
@Entity
@Table(name = "contact")
public class Contact implements Serializable, Identifiable<String> {
private static final long serialVersionUID = 1L;
@Id
@GenericGenerator(
name = "assigned-sequence",
strategy = "net.atos.seirich.support.domain.idgenerator.CTCIDGenerator",
parameters = @org.hibernate.annotations.Parameter(
name = "sequence_name",
value = "hibernate_sequence"
)
)
@GeneratedValue(generator = "assigned-sequence", strategy = GenerationType.SEQUENCE)
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
liquibase XML:
<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
<property name="autoIncrement" value="true" dbms="mysql,h2,postgresql,oracle"/>
<property name="floatType" value="float4" dbms="postgresql, h2"/>
<property name="floatType" value="float" dbms="mysql, oracle"/>
<changeSet id="20160513091901-1" author="jhipster">
<createTable tableName="contact">
<column name="id" type="longvarchar" autoIncrement="${autoIncrement}">
<constraints primaryKey="true" nullable="false"/>
</column>
</changeSet>
</databaseChangeLog>
顺便问一下,是否可以避免使用参数sequence_name,这样hibernate就可以自己处理了?
如果有人能帮助我,谢谢!
3条答案
按热度按时间93ze6v8z1#
问题是
SequenceStyleGenerator
期望返回一个数值,而不是String
。我已经试过解决这个问题的方法了,效果很好。因此,您需要像这样更改生成器:
您的Map将变为:
现在,插入以下图元时:
Hibernate生成正确的标识符:
代码在GitHub上可用。
ilmyapht2#
是的,hibernate有预建的String生成器。只需将您的
@GenericGenerator
定义替换为另一个策略。要了解更多关于不同的hibernate生成器的信息,可以查看documentation。
bwitn5fc3#
可以通过以下解决方案重用序列样式生成器
和实体
结果:
1.使用数字数据库序列计数器
1.支持数据库结构和集成优化程序的选项
请记住,如果您使用任何填充脚本,如 import.sql/data.sql,则initial_value参数必须手动与表中的行数同步(硬编码或从外部应用程序提供)或nextval采用id字符串键格式