Spring & 没有 jpa 的休眠
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。在我看来,这个用户 class 不能对数据库层使用任何注释。它不能指定 @Table(name = "users")
或其他内容。它应该是一个带有 getter 和 setter 的简单对象。
数据库层应该决定如何存储数据,这在很大程度上取决于数据库(例如 MongoDB 或 MySQL)。
我遵循了一些 Hibernate 教程并得到了以下 @Configuration
class
@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;
}
}
它工作得很好,除了它使用带注释的 class。
如何将我的 hbm/user.xml
添加到 sessionBuilder?
我尝试使用 Configuration
class,我在一些示例中找到了它,但是方法 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();
}
对于我的新项目,我计划使用 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。在我看来,这个用户 class 不能对数据库层使用任何注释。它不能指定 @Table(name = "users")
或其他内容。它应该是一个带有 getter 和 setter 的简单对象。
数据库层应该决定如何存储数据,这在很大程度上取决于数据库(例如 MongoDB 或 MySQL)。
我遵循了一些 Hibernate 教程并得到了以下 @Configuration
class
@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;
}
}
它工作得很好,除了它使用带注释的 class。
如何将我的 hbm/user.xml
添加到 sessionBuilder?
我尝试使用 Configuration
class,我在一些示例中找到了它,但是方法 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();
}