Вместо изменения таблицы я настроил способ, которым Hibernate генерирует идентификаторы.
вместо использования:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Я реализовал собственный генератор идентификаторов:
@GenericGenerator(name = "sequence_id", strategy =
"com.xyz.utils.CustomIdGenerator",
parameters = {
@org.hibernate.annotations.Parameter(
name = "table_name", value = "myTable")
})
@GeneratedValue(generator = "sequence_id")
класс CustomIdGenerator:
public class CustomIdGenerator implements IdentifierGenerator,Configurable{
private String table_name ;
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object)
throws HibernateException {
Connection connection = session.connection();
try {
Statement statement=connection.createStatement();
ResultSet rs=statement.executeQuery("select count(id) as Id from "
+table_name );
if(rs.next())
{
int id=rs.getInt(1)+1;
Integer generatedId = new Integer(id);
System.out.println("Generated Id: " + generatedId);
return generatedId;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry)
throws MappingException {
setTable_name(params.getProperty("table_name")); }
//getters and setters
}
проблема этого решения заключается в выполнении выбора для каждого идентификатора, поэтому кажется, что он генерирует нагрузку на СУБД и замедляет ее. и rs повторяется дважды для первого id (). Любое предложение по оптимизации приветствуется