Весенние данные загрузки не сохранены из прослушивателя событий - PullRequest
2 голосов
/ 06 мая 2019

У меня есть проект начальной загрузки, в котором я пытаюсь сохранить некоторые данные в таблице MySql изнутри и прослушивателя событий.

Я использую Spring boot v1.5.10.RELEASE , JDK 1.8 и MySql 5.7

Я создал пользовательское событие (TestEvent) в моем проекте и следующий асинхронный прослушиватель для этого события.

@Component
public class TestListener implements ApplicationListener<TestEvent> {

    private TestService testService;

    @Autowired
    public JobCreatedListener(TestService testService) {
        this.testService = testService;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void onApplicationEvent(TestEvent applicationEvent) {
        testService.save(1L,"One");
    }
}

Существует класс обслуживания TestService, который отвечает за сохранение данных.

@Service
public class TestService {

    @Autowired
    private TestEntityRepository testEntityRepository;

    @Transactional
    public TestEntity save(long id, String name) {        
            TestEntity entity = new TestEntity();
            entity.setId(id);
            entity.setName(name);
            return testEntityRepository.save(entity);        
    }

}

Проблема, с которой я сталкиваюсь, заключается в том, что когда этот слушатель запускается, метод testService.save(1L,"One") выполняется успешно (без каких-либо ошибок или исключений), но данные не сохраняются в таблице.

Однако, когда я вызываю тот же метод из контроллера, он успешно выполняется, и данные сохраняются в таблице.

Я пытался аннотировать свой метод с помощью @Transactional(propagation = Propagation.REQUIRES_NEW), но это тоже не имеет значения.

Я не уверен, в чем проблема. Любая помощь приветствуется.


Классы сущностей и хранилища:

TestEntity

@Entity
@Table(name = "testentity")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class TestEntity implements Serializable {

    private long id;

    private String name;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public long getId() {
        return this.id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Column(name = "name", length = 128)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

TestEntityRepository

@Repository
public interface TestEntityRepository extends JpaRepository<TestEntity, Long>, JpaSpecificationExecutor<TestEntity> {
}

1 Ответ

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

Попробуйте явно добавить транзакциюManager в аннотацию @Transactional. Это может быть проблемой.

@Transactional(propagation = Propagation.REQUIRES_NEW, value= YOUR_TXN_MANAGER)

Ваш YOUR_TXN_MANAGER должен совпадать с тем, который используется, когда вы непосредственно пытаетесь вызвать тот же сервис из метода контроллера.

Также добавьте то же определение в ваш репозиторий.

@Transactional(value = YOUR_TXN_MANAGER)
@Repository
public interface TestEntityRepository extends JpaRepository<TestEntity, Long>, JpaSpecificationExecutor<TestEntity> {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...