在春季启动中使用交易型

发布于 2025-02-05 04:07:36 字数 2168 浏览 3 评论 0原文

我在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

只想待在家 2025-02-12 04:07:36

对于初学者来说,使用适当的图层并写下服务并使用JPA代替普通的Hibernate。如果您想要session可以始终使用entitymanager.unwrap获得基础session

@Service
@Transactional
public StateService {

  @PersistenceContext
  private EntityManager em;

  public void save(State state) {
    em.persist(state);
  }

在控制器中使用此服务,而不是SessionFactory

@RestController
public class RestAPIController {

    private final StateService stateService;

    RestAPIController(StateService stateService) {
      this.stateService=stateService;
    }

    @PutMapping("/addS")
    public void addSt(@RequestParam("cc") String cc, @RequestParam("st") String st) {
        CC cc1= new CC();
        CC.setCode(cc);
        State state = new State(cc,st);
        stateService.save(state);
    }
}

现在,将您的config类放置,然后重新启动应用程序。

Note

使用Spring Data JPA时,它甚至更容易,定义一个存储库扩展crudrepository并将其注入服务,而不是EntityManager。 (我假设long是您定义的主键的类型)。

public interface StateRepository extends CrudRepository<State, Long> {}
@Service
@Transactional
public StateService {

  private final StateRepository states;

  public StateService(StateRepository states) {
    this.states=states;
  }

  public void save(State state) {
    states.save(state);
  }
}

For starters use proper layers and write a service and use JPA instead of plain Hibernate. If you want a Session you can always use EntityManager.unwrap to obtain the underlying Session.

@Service
@Transactional
public StateService {

  @PersistenceContext
  private EntityManager em;

  public void save(State state) {
    em.persist(state);
  }

Use this service in your controller instead of the SessionFactory.

@RestController
public class RestAPIController {

    private final StateService stateService;

    RestAPIController(StateService stateService) {
      this.stateService=stateService;
    }

    @PutMapping("/addS")
    public void addSt(@RequestParam("cc") String cc, @RequestParam("st") String st) {
        CC cc1= new CC();
        CC.setCode(cc);
        State state = new State(cc,st);
        stateService.save(state);
    }
}

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 an EntityManager. (I'm assuming that Long is the type of primary key you defined).

public interface StateRepository extends CrudRepository<State, Long> {}
@Service
@Transactional
public StateService {

  private final StateRepository states;

  public StateService(StateRepository states) {
    this.states=states;
  }

  public void save(State state) {
    states.save(state);
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文