Spring和Hibernate的JPA外实现

3

我计划在我的新项目中使用Hibernate 5和Spring 4,并像往常一样将其分成不同的层/项目。

Gradle依赖项:

"org.springframework:spring-webmvc:4.2.1.RELEASE",
"org.springframework:spring-orm:4.2.1.RELEASE",
'org.hibernate:hibernate-core:5.0.2.Final',
'mysql:mysql-connector-java:5.1.36'

有一个API项目,其中包含一个User.class。在我看来,这个用户类不应该使用任何数据库层注解。它不应该指定@Table(name = "users")或其他东西。它应该是一个简单的对象,具有getter和setter。

数据库层应该决定如何存储数据,这强烈依赖于数据库(例如MongoDB或MySQL)。

我遵循了一些Hibernate的教程,并最终得到了以下的@Configuration类。

@Configuration
@ComponentScan("de.pentos.proto")
@EnableWebMvc
@EnableTransactionManagement
public class AppConfig {
    private static final Logger log = LoggerFactory.getLogger(AppConfig.class);

    private static Properties getHibernateProperties() {
        final Properties properties = new Properties();
        properties.put("hibernate.show_sql", "true");
        // properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.put("hbm2ddl.auto", "create");
        return properties;
    }

    {
        log.debug("Here am I: {}");
    }

    @Bean(name = "dataSource")
    public DataSource getDataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/myschema");
        dataSource.setUsername("user");
        dataSource.setPassword("password");
        return dataSource;
    }

    @Inject
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(final DataSource dataSource) {
        final LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
        sessionBuilder.addAnnotatedClasses(User.class);
        sessionBuilder.addProperties(getHibernateProperties());
        return sessionBuilder.buildSessionFactory();
    }

    @Inject
    @Bean(name = "transactionManager")
    public HibernateTransactionManager getTransactionManager(final SessionFactory sessionFactory) {
        final HibernateTransactionManager transactionManager = new HibernateTransactionManager(
                sessionFactory);
        return transactionManager;
    }
}

它运作得非常好,只是它使用了一个带注解的类。

我该如何将我的 hbm/user.xml 添加到 sessionBuilder 中?

我尝试使用一些例子中找到的 Configuration 类,但是发现 buildSessionFactory() 方法已经被弃用。

我还尝试了在这里描述的 ServiceRegistry,但是失去了数据源方法,没有数据源系统无法设置 HibernateTransactionManager
没有 HibernateTransactionManager 我就不能使用 @Transactional,而且我不喜欢手动打开和关闭事务。

目前我正处于困境中,真的需要帮助让它工作起来。我已经考虑放弃 Hibernate,使用我那个好老朋友 MyBatis,但你知道,我想学习点新东西…


你为什么想要加载hbm/user.xml文件? - Arpit Aggarwal
因为它包含用户对象的数据映射的XML描述,而用户对象不应包含JPA注释。 - Nabor
1个回答

3
xml文件作为资源添加到SessionFactory中,如下所示:
@Inject
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(final DataSource dataSource) {
        final LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
        sessionBuilder.addResource("/path-to-/hbm/user.xml");
        sessionBuilder.addAnnotatedClasses(User.class);
        sessionBuilder.addProperties(getHibernateProperties());
        return sessionBuilder.buildSessionFactory();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接