gpt4 book ai didi

java - Hibernate 事务管理器 - Java 配置

转载 作者:行者123 更新时间:2023-11-29 05:48:30 28 4
gpt4 key购买 nike

一段时间以来,我一直在用头撞墙,试图让它发挥作用。我创建了以下数据访问对象:

public interface GenericDAO<T, ID extends Serializable> {
T findById(ID id);
List<T> findAll();
T save(T entity);
void update(T entity);
void delete(T entity);
}

public class GenericHibernateDAO<T, ID extends Serializable> implements GenericDAO<T, ID> {

private final Class<T> persistentClass;
private final SessionFactory sessionFactory;

public GenericHibernateDAO(final SessionFactory sessionFactory) {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
this.sessionFactory = sessionFactory;
}

protected Session getSession() {
return sessionFactory.getCurrentSession();
}

public Class<T> getPersistentClass() {
return persistentClass;
}

@Override
public T findById(final ID id) {
return (T) getSession().load(getPersistentClass(), id);
}

@Override @SuppressWarnings("unchecked")
public List<T> findAll() {
return findByCriteria();
}

protected List<T> findByCriteria(final Criterion... criterion) {
final Criteria crit = getSession().createCriteria(getPersistentClass());
for (final Criterion c : criterion) {
crit.add(c);
}
return crit.list();
}

@Override
public T save(final T entity) {
getSession().saveOrUpdate(entity);
return entity;
}

@Override
public void delete(final T entity) {
getSession().delete(entity);
}

@Override
public void update(final T entity) {
getSession().saveOrUpdate(entity);
}
}

@Repository
public class StockHibernateDAO extends GenericHibernateDAO<Stock, String> implements StockDAO {

@Inject
public StockHibernateDAO(final SessionFactory sessionFactory) {
super(sessionFactory);
}
}

我正在尝试使用 Java Configuration 进行设置,所以这是我设置服务层的配置:

@Configuration @Profile("hibernate")
@EnableCaching @EnableTransactionManagement
@ComponentScan("reference.dao.hibernate")
public class HibernateServiceConfig implements TransactionManagementConfigurer {

@Inject private StockDAO stockDao; //No extra methods, just the base stuff for now

@Bean(destroyMethod = "shutdown")
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL).addScript("classpath:schema.sql").build();
}

@Bean
public SessionFactory sessionFactory() {
return new LocalSessionFactoryBuilder(dataSource()).addAnnotatedClasses(Stock.class)
.setProperty("hibernate.show_sql", "true")
.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory")
.setProperty("hibernate.cache.use_query_cache", "true")
.setProperty("hibernate.cache.use_second_level_cache", "true")
.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect").buildSessionFactory();
}

@Override @Bean
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new HibernateTransactionManager(sessionFactory());
}

}

这是交易服务:

@Service
public class TradingServiceImpl implements TradingService {
@Inject private StockDAO stockDAO;

@Override @Transactional
@CachePut(value = "stockCache", key = "#stock.name")
public Stock addNewStock(final Stock stock) {
stockDAO.save(stock);
return stock;
}

@Override @Cacheable(value = "stockCache")
public Stock getStock(final String stockName) {
return stockDAO.findById(stockName);
}

@Override @CacheEvict(value = "stockCache", key = "#stock.name")
public void removeStock(final Stock stock) {
stockDAO.delete(stock);
}

@Override @CacheEvict(value = "stockCache", key = "#stock.name")
public void updateStock(final Stock stock) {
stockDAO.update(stock);
}

@Override
public List<Stock> getAll() {
return stockDAO.findAll();
}
}

只有在保存方法中添加 session.flush() 时,股票的保存才似乎完成。按照我的理解,在服务层方法周围使用 TransactionManager 和 @Transactional 实际上应该会导致为我进行调用。此配置缺少什么?

最佳答案

因为你正在注入(inject)一个Session

  @Bean
public Session session() {
return sessionFactory().openSession();
}

Spring 无法围绕它添加它的事务行为。让 Spring 打开 session 并处理它的事务。

不是注入(inject)Session,而是注入(inject)SessionFactory。在您的 DAO 中,为 SessionFactory 保留一个属性并使用 sessionFactory.getCurrentSession() 获取 session 。

当 Spring 看到 @Transactional 时,它将获取 SessionFactory,调用 openSession(),在其上开始事务,然后调用你的方法。当您的方法成功返回时,它将关闭该事务。

您可能还应该 @Autowired 服务类中的 dao。

关于java - Hibernate 事务管理器 - Java 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14901748/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com