Hibernate 如何修复';没有实际交易的entitymanager';何时调用deleteallby方法?

Hibernate 如何修复';没有实际交易的entitymanager';何时调用deleteallby方法?,hibernate,spring-boot,jpa,Hibernate,Spring Boot,Jpa,我正在构建一个spring boot后端,希望创建一个rest端点,该端点根据供应商id删除所有项目。当我调用rest端点时,我得到“没有entitymanager,实际事务可用”异常 如何修复此错误 我尝试了@Transactional年金,但仍然出现错误 型号: public class Item { public Item() {} @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Colu

我正在构建一个spring boot后端,希望创建一个rest端点,该端点根据供应商id删除所有项目。当我调用rest端点时,我得到“没有entitymanager,实际事务可用”异常

如何修复此错误

我尝试了
@Transactional
年金,但仍然出现错误

型号:

public class Item {

    public Item() {}

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ItemId")
    private int id;
    public int getId() {
        return this.id;
    }
    public void setId(int Id) {
        this.id = Id;
    }

    @Column(name = "Suppid")
    private int suppid;
    public int getSuppid() {
        return this.suppid;
    }
    public void setSuppid(int Suppid) {
        this.suppid = Suppid;
    }  
}
存储库:

public interface ItemRepository extends CrudRepository<Item, Integer> {
    @Transactional
    public void deleteAllBySuppid(int suppid);
}
public interface ItemRepository extends CrudRepository<Item, Integer> {

    public void deleteAllBySuppid(int suppid);
}
pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.0</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.0.Final</version>
    </dependency>
</dependencies>

好吧,这是我的错误,因为我把
@Transactional
放错地方了。我必须将年金放在我的控制器中的方法上,而不是放在积存库中

存储库:

public interface ItemRepository extends CrudRepository<Item, Integer> {
    @Transactional
    public void deleteAllBySuppid(int suppid);
}
public interface ItemRepository extends CrudRepository<Item, Integer> {

    public void deleteAllBySuppid(int suppid);
}

要解释为什么需要
@Transactional


查看
CrudMethodMetadataPostProcessor.postProcess
方法时,
实现
集中包含的所有方法都将通过
事务同步管理器调用。Custum函数需要手动添加事务。

将该逻辑放在服务方法中,用
@Transactional
注释该方法。这是业务逻辑,属于服务层而不是web层。您是否配置了
EntityManager
?正如@M.Deinum所说,您必须将逻辑放入服务类中,并用{@transactional}@M.Deinum对其进行注释,很抱歉没有尽快回复您的评论,但是谢谢你给我一个解决方案的提示。我将注释放置到该方法中。我知道,我没有一个或多个服务,但这个后端是我学校项目的一部分。我是使用SpringBoot制作后端程序的初学者,我还没有时间阅读有关服务的内容,因为我希望它能让代码更简单。但是为了自我教育,我接受了您的建议,将来将所有业务逻辑都放在服务中。非常感谢您的帮助。您真的应该有一个服务层/外观。你不知道;I don’我不希望您的web层成为事务边界。创建一个服务并在那里添加它会更好
@Transactional
public void deleteSupplier(@RequestParam(name = "suppid") int suppid) {

    itemrepo.deleteAllBySuppid(suppid);
    supprepo.delete(supprepo.findByid(suppid));
}