【问题标题】:how to get ObjectNameNormalizer in hibernate 5如何在休眠 5 中获取 ObjectNameNormalizer
【发布时间】:2017-08-12 01:07:53
【问题描述】:
我正在尝试将我的休眠版本从 3 升级到 5.0。
您能否告知如何在休眠 5 中获取 ObjectNameNormalizer。我当前的代码仍在使用配置来检索会话工厂,由于我们在代码中动态设置属性,因此我无法更改它。
下面的代码需要在hibernate 5中重写-
Mappings mappings = c.createMappings(); (this method does not exist in 5.0)
props.put(TableGenerator.IDENTIFIER_NORMALIZER, mappings.getObjectNameNormalizer());
【问题讨论】:
标签:
hibernate
hibernate-5.x
【解决方案1】:
试试这个解决方案。我们遇到了同样的问题。
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;
}
}
}
【解决方案2】:
在线获取ObjectNameNormalizer 实例的大多数现有答案都是使用MetadataBuildingContextTestingImpl 获取MetadataBuildingContext。实际上,MetadataBuildingContextTestingImpl 类属于 'org.hibernate:hibernate-testing' 依赖项。测试范围 hibernate-testing 依赖项不是运行时类路径的候选对象。因此,添加了以下工作解决方案来实例化ObjectNameNormalizer,它只需要在您的类路径中使用'org.hibernate:hibernate-core'
props.put(PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER, new ObjectNameNormalizer() {
@Override
protected MetadataBuildingContext getBuildingContext() {
StandardServiceRegistry serviceRegistry = sessionFactory.getSessionFactoryOptions().getServiceRegistry();
MetadataBuildingOptions buildingOptions = new MetadataBuilderImpl.MetadataBuildingOptionsImpl(serviceRegistry);
BootstrapContext bootstrapContext = new BootstrapContextImpl( serviceRegistry, buildingOptions );
InFlightMetadataCollector metadataCollector = new InFlightMetadataCollectorImpl( bootstrapContext, buildingOptions );
return new MetadataBuildingContextRootImpl(bootstrapContext, buildingOptions, metadataCollector);
}
});