在春季启动中使用交易型
我在Spring Boot应用程序中使用Hibernate时会遇到错误 我使用以下配置类:
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@org.springframework.context.annotation.Configuration
@EnableTransactionManagement
public class Config {
@Bean
public SessionFactory sessionFactory() {
Configuration configuration = new Configuration();
configuration.configure();
configuration.addAnnotatedClass(Ct.class);
configuration.addAnnotatedClass(St.class);
SessionFactory sessionFactory = configuration.buildSessionFactory();
return sessionFactory;
}
}
@RestController
public class RestAPIController {
@Autowired
private SessionFactory sessionFactory;
@PutMapping("/addS")
@Transactional
public void addSt(@RequestParam("cc") String cc,@RequestParam("st") String st) {
CC cc1= new CC();
CC.setCode(cc);
State state = new State(cc,st);
sessionFactory.getCurrentSession().save(state);
}
}
}
我在Addst方法中添加@transactional的主要原因是由于错误:当数据库期间发生异常时,事务仍然是一个活动
。 因此,我转向使用Spring Boot来管理交易。我不确定在这里做什么。
----------------------------------------------------------------------------
@Repository
public interface StateRepository extends CrudRepository<State, String> {}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.ArrayList;
import java.util.List;
@Service
@Transactional
public class StateService {
@Autowired
private StateRepository stateRepository;
public void save(State state) {
stateRepository.save(state);
}
public List<State> findAll() {
List<State> states = new ArrayList<>();
stateRepository.findAll().forEach(states::add);
return states;
}
}
I am getting the error while using hibernate in spring boot application No qualifying bean of type TransactionManager' available
I am using the following config class:
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@org.springframework.context.annotation.Configuration
@EnableTransactionManagement
public class Config {
@Bean
public SessionFactory sessionFactory() {
Configuration configuration = new Configuration();
configuration.configure();
configuration.addAnnotatedClass(Ct.class);
configuration.addAnnotatedClass(St.class);
SessionFactory sessionFactory = configuration.buildSessionFactory();
return sessionFactory;
}
}
@RestController
public class RestAPIController {
@Autowired
private SessionFactory sessionFactory;
@PutMapping("/addS")
@Transactional
public void addSt(@RequestParam("cc") String cc,@RequestParam("st") String st) {
CC cc1= new CC();
CC.setCode(cc);
State state = new State(cc,st);
sessionFactory.getCurrentSession().save(state);
}
}
}
The main reason I added the @Transactional in the addSt method is due to error:The transaction was still an active
when an exception occurred during Database.
So I turned to use spring boot for managing transactions. I am not sure what to do here.
--------------------UPDATED CODE--------------------
@Repository
public interface StateRepository extends CrudRepository<State, String> {}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.ArrayList;
import java.util.List;
@Service
@Transactional
public class StateService {
@Autowired
private StateRepository stateRepository;
public void save(State state) {
stateRepository.save(state);
}
public List<State> findAll() {
List<State> states = new ArrayList<>();
stateRepository.findAll().forEach(states::add);
return states;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于初学者来说,使用适当的图层并写下服务并使用JPA代替普通的Hibernate。如果您想要
session
可以始终使用entitymanager.unwrap
获得基础session
。在控制器中使用此服务,而不是
SessionFactory
。现在,将您的
config
类放置,然后重新启动应用程序。Note
使用Spring Data JPA时,它甚至更容易,定义一个存储库扩展
crudrepository
并将其注入服务,而不是EntityManager
。 (我假设long
是您定义的主键的类型)。For starters use proper layers and write a service and use JPA instead of plain Hibernate. If you want a
Session
you can always useEntityManager.unwrap
to obtain the underlyingSession
.Use this service in your controller instead of the
SessionFactory
.Now ditch your
Config
class and restart the application.NOTE
When using Spring Data JPA it is even easier, define a repository extending
CrudRepository
and inject that into the service instead of anEntityManager
. (I'm assuming thatLong
is the type of primary key you defined).