У меня есть проект начальной загрузки, в котором я пытаюсь сохранить некоторые данные в таблице 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> {
}