java - 使用 Hibernate 5 和 Spring 4 的程序化 SchemaExport/SchemaUpdate

标签 java spring hibernate spring-4 hibernate-5.x

使用 Spring 4 和 Hibernate 4,我能够使用反射从当前环境中获取 Hibernate 配置对象,使用以下代码:

@Autowired LocalContainerEntityManagerFactoryBean lcemfb;

EntityManagerFactoryImpl emf = (EntityManagerFactoryImpl) lcemfb.getNativeEntityManagerFactory();
SessionFactoryImpl sf = emf.getSessionFactory();
SessionFactoryServiceRegistryImpl serviceRegistry = (SessionFactoryServiceRegistryImpl) sf.getServiceRegistry();
Configuration cfg = null;

try {
    Field field = SessionFactoryServiceRegistryImpl.class.getDeclaredField("configuration");
    field.setAccessible(true);
    cfg = (Configuration) field.get(serviceRegistry);
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
    e.printStackTrace();
}

SchemaUpdate update = new SchemaUpdate(serviceRegistry, cfg);

在 Hibernate 5 中,我必须使用一些 MetadataImplementor,这似乎不适用于任何这些对象。我还尝试将 MetadataSourcesserviceRegistry 一起使用。但它确实说这是错误的 ServiceRegistry

还有其他方法可以让这个工作吗?

最佳答案

这个问题的基本思路是:

org.hibernate.integrator.spi.Integrator 的实现,它将所需的数据存储到某个持有者。将实现注册为服务并在需要的地方使用它。

您可以在这里找到工作示例 https://github.com/valery-barysok/spring4-hibernate5-stackoverflow-34612019


创建org.hibernate.integrator.api.integrator.Integrator

import hello.HibernateInfoHolder;
import org.hibernate.boot.Metadata;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.service.spi.SessionFactoryServiceRegistry;

public class Integrator implements org.hibernate.integrator.spi.Integrator {

    @Override
    public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
        HibernateInfoHolder.setMetadata(metadata);
        HibernateInfoHolder.setSessionFactory(sessionFactory);
        HibernateInfoHolder.setServiceRegistry(serviceRegistry);
    }

    @Override
    public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
    }
}

创建META-INF/services/org.hibernate.integrator.spi.Integrator文件

org.hibernate.integrator.api.integrator.Integrator

import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        new SchemaExport((MetadataImplementor) HibernateInfoHolder.getMetadata()).create(true, true);
        new SchemaUpdate(HibernateInfoHolder.getServiceRegistry(), (MetadataImplementor) HibernateInfoHolder.getMetadata()).execute(true, true);
    }
}

关于java - 使用 Hibernate 5 和 Spring 4 的程序化 SchemaExport/SchemaUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34612019/

相关文章:

Java 警告 : Varargs method could cause heap pollution from non-reifiable varargs parameter

java - ./server_start.sh : line 41: kill: (21556) - No such process

java - 从 POJO 生成 Map<String,String>

java - Spring JDBC 与 JDBC

java - 增强 hibernate IdentityGenerator 并且不破坏模式导出

mysql - Hibernate 乐观锁定..它是如何工作的?

java - 使用hibernate执行原生sql

java - 将带有字符串和 int 的数组传递给另一个类

java - Spring 多部分文件最大大小

java - JPA 乐观锁定与同步 Java 方法