これについて長い間研究した後、最終的に私は解決策を見つけました。
実際、jpaでシーケンスジェネレーターを使用する場合、次のIDはデータベースシーケンスによって割り当てられるため、データベースに保存する前にエンティティのIDを取得することはできません。
カスタムジェネレータを使用する場合にIDを取得する方法は1つあり、保存する前にIDを取得できます。簡単な実装は次のとおりです。
public class CustomGenerator extends IdentityGenerator implements Configurable {
private IdentifierGenerator defaultGenerator;
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
Long idValue = (Long)defaultGenerator.generate(session, object);
//idValue will be assigned your entity id
return idValue;
}
@Override
public void configure(Type type, Properties params, Dialect d) throws MappingException {
DefaultIdentifierGeneratorFactory dd = new DefaultIdentifierGeneratorFactory();
dd.setDialect(d);
defaultGenerator = dd.createIdentifierGenerator("sequence", type, params);
}
}
idフィールドにCustomGeneratorを使用する:
@Id
@Basic(optional = false)
@Column(name = "ID", nullable = false)
@GenericGenerator(name = "seq_id", strategy = "com.yoncabt.abys.core.listener.CustomGenerator", parameters = { @Parameter(name = "sequence", value = "II_FIRM_DOC_PRM_SEQ") })
@GeneratedValue(generator = "seq_id")
private Long id;