Это довольно запутанный.Я прочитал десятки ссылок, предназначенных для объяснения того, как использовать @Transactional, но я убедился, что транзакции не создаются.
Main.java
@SpringBootApplication
@EnableJpaRepositories(basePackages="com.mypackage")
@EnableTransactionManagement
@EntityScan(basePackages=["com.mypackage"])
@EnableJpaAuditing
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
SubscriptionController.java
@RequestMapping("/api/subscription")
@RestController
public class SubscriptionController {
@Autowired SubscriptionService subscriptionService;
Logger log = LogManager.getLogger(this.getClass().getName());
public Collection<Subscriptions> subscribe(...) {
log.info("transName: " + TransactionSynchronizationManager.getCurrentTransactionName + ", isAlive: " + TransactionSynchronizationManager.isActualTransactionActive());
return subscriptionService.getAllSubscriptions();
}
}
SubscriptionService.java
@Service
public class SubscriptionService {
@Transactional public Collection<Subscription> getAllSubscriptions() {
log.info("transName: " + TransactionSynchronizationManager.getCurrentTransactionName() + ", isAlive: " + TransactionSynchronizationManager.isActualTransactionActive());
//return subscriptions via JPQL queries here
}
}
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RELEASE")
}
}
plugins {
id 'war'
}
apply plugin: 'org.springframework.boot'
repositories {
mavenCentral()
}
def springVersion = '5.0.3.RELEASE'
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.3.11'
testCompile group: 'junit', name: 'junit', version: '4.12'
compile "org.springframework.security:spring-security-core:${springVersion}", exclude
compile "org.springframework.security:spring-security-config:${springVersion}", exclude
compile "org.springframework.security:spring-security-web:${springVersion}", exclude
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile "org.springframework:spring-test:${springVersion}", exclude
implementation 'org.springframework.boot:spring-boot-starter-web:2.0.5.RELEASE', exclude
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.0.5.RELEASE'
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.11'
compile 'org.liquibase:liquibase-core:3.6.1'
compile 'org.liquibase:liquibase-groovy-dsl:1.2.2'
}
Поэтому, когда я запускаю вызов API, я получаю значение null, false в качестве вывода журнала.В контракте для @Transactional говорится, что код аспекта транзакции будет сплетен в аннотированный метод транзакции, так что транзакция (и, следовательно, управление данными и соединение БД) будет установлена перед методом и закрыта через некоторое время после.Но это не имеет значения, потому что не должно быть весной создание сущностного менеджера до запуска контроллера?Обе вещи здесь не работают.Ни Spring, ни @Transactional не настраивают транзакции.Это приводит к невозможности выполнить какой-либо запрос, кроме того, что выполнимо через подклассы JpaRepository.Каким-то образом мои репозитории Jpa могут настраивать транзакции для своих собственных методов.Но что, если их результаты имеют лениво инициализированные свойства?Мне нужен сеанс гибернации, чтобы получить их.Поэтому мне нужна сделка.