IT虾米网

java之没有 jpa 的 Spring 和 Hibernate

zhengyun_ustc 2023年11月15日 编程语言 110 0

对于我的新项目,我计划使用 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 here但后来失去了我的数据源方法,没有数据源,系统无法设置 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(); 
    } 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!