繁体   English   中英

没有jpa的Spring和Hibernate

[英]Spring & Hibernate without jpa

对于我的新项目,我计划使用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类,我在一些示例中找到了,但不推荐使用Method buildSessionFactory()

我也尝试了这里描述的ServiceRegistry 但后来丢失了我的数据源方法,没有数据源,系统无法设置HibernateTransactionManager
没有HibernateTransactionManager我无法使用@Transactional而我不想手动打开和关闭我的事务。

目前我正在转圈,真的需要帮助才能让它发挥作用。 我已经考虑过抛弃Hibernate并使用我的旧MyBatis方法,但是你知道,我喜欢学习一些新东西......

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();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM