- コードの下
は休止状態5に再書き込みする必要があります。我々は同じ問題に直面した。
package test.hibernate.generator;
import java.io.Serializable;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.Configurable;
import org.hibernate.id.IdentityGenerator;
import org.hibernate.id.enhanced.TableGenerator;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.testing.boot.MetadataBuildingContextTestingImpl;
import org.hibernate.type.LongType;
import org.hibernate.type.Type;
import hu.gov.nebih.cdv.CdvHelper;
import hu.gov.nebih.domain.entity.BaseEntity;
public class CustomIdGenerator extends IdentityGenerator implements Configurable {
private CustomTableGenerator tableGenerator = new CustomTableGenerator();
private ServiceRegistry serviceRegistry;
@Override
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
if (obj == null)
throw new HibernateException(new NullPointerException());
if (isIdNull(obj)) {
return generateCustomId(session, obj);
} else {
return getUsedId(obj);
}
}
private boolean isIdNull(Object obj) {
return (obj instanceof BaseEntity && ((BaseEntity) obj).getId() == null);
}
private Serializable getUsedId(Object obj) {
if (obj instanceof BaseEntity) {
return ((BaseEntity) obj).getId();
}
return null;
}
private synchronized Serializable generateCustomId(SessionImplementor session, Object obj) {
configureTableGenerator(session, tableGenerator);
Long nextVal = (Long) tableGenerator.generate(session, obj);
if (nextVal != null) {
//any operation
}
return nextVal;
}
private CustomTableGenerator configureTableGenerator(SessionImplementor session, CustomTableGenerator tg) {
if (tg.isConfigured()) {
return tg;
}
final MetadataBuildingContext context = new MetadataBuildingContextTestingImpl((StandardServiceRegistry) serviceRegistry);
ObjectNameNormalizer normalizer = new ObjectNameNormalizer() {
@Override
protected MetadataBuildingContext getBuildingContext() {
return context;
}
};
Properties params = new Properties();
params.put(TableGenerator.TABLE_PARAM, "custom_sequence");
params.put(TableGenerator.VALUE_COLUMN_PARAM, "next_val");
params.put(TableGenerator.INITIAL_PARAM, 7000000);
params.put(TableGenerator.INCREMENT_PARAM, 1);
params.put(TableGenerator.IDENTIFIER_NORMALIZER, normalizer);
params.put(TableGenerator.SEGMENT_COLUMN_PARAM, "sequence_name");
params.put(TableGenerator.SEGMENT_VALUE_PARAM, "value_param");
tg.configure(new LongType(), params, session.getFactory().getServiceRegistry());
tg.registerExportables(context.getMetadataCollector().getDatabase());
tg.setConfigured(true);
return tg;
}
@Override
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
this.serviceRegistry = serviceRegistry;
}
class CustomTableGenerator extends TableGenerator {
private boolean configured = false;
public boolean isConfigured() {
return configured;
}
public void setConfigured(boolean configured) {
this.configured = configured;
}
}
}