Как исправить «отсутствие сущности менеджера с реальной транзакцией» при вызове метода deleteallby? - PullRequest
0 голосов
/ 20 мая 2019

Я создаю внутреннюю часть пружинной загрузки и хочу создать конечную точку отдыха, которая удаляет все элементы по идентификатору поставщика.Когда я вызываю остальную конечную точку, я получаю исключение «нет управления сущностью с действующей транзакцией».

Как я могу исправить эту ошибку?

Я пробовал аннотацию @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 void deleteSupplier(@RequestParam(name = "suppid") int suppid) {

    itemrepo.deleteAllBySuppid(suppid);
    supprepo.delete(supprepo.findByid(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>

Я ожидаю, что элемент будет удален, но выдает:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call] with root cause

1 Ответ

0 голосов
/ 20 мая 2019

Хорошо, это была моя ошибка, потому что я поставил @Transactional в неправильном месте. Мне пришлось поместить аннотацию на метод в моем контроллере, а не в CrudRepository.

Repository:

public interface ItemRepository extends CrudRepository<Item, Integer> {

    public void deleteAllBySuppid(int suppid);
}

Контроллер:

@Transactional
public void deleteSupplier(@RequestParam(name = "suppid") int suppid) {

    itemrepo.deleteAllBySuppid(suppid);
    supprepo.delete(supprepo.findByid(suppid));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...