@Transactional не влияет на мое приложение Spring Boot - PullRequest
0 голосов
/ 03 октября 2018

Это довольно запутанный.Я прочитал десятки ссылок, предназначенных для объяснения того, как использовать @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 могут настраивать транзакции для своих собственных методов.Но что, если их результаты имеют лениво инициализированные свойства?Мне нужен сеанс гибернации, чтобы получить их.Поэтому мне нужна сделка.

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Вы также можете опубликовать свой файл pom.xml.Необходимо добавить зависимость spring-data или spring-tx, чтобы автоконфигуратор создал диспетчер транзакций.В противном случае явно создайте bean-компонент менеджера транзакций и снова запустите код.

Вы можете включить TRACE журналы уровня для org.springframework и посмотреть, инициализирован ли менеджер транзакций.Также проверьте журналы перехватчиков транзакций.Используйте logging.level.org.springframework.transaction.interceptor=TRACE

0 голосов
/ 03 октября 2018

Попробуйте удалить

@EnableJpaRepositories(basePackages="com.mypackage")
@EnableTransactionManagement

SpringBoot должен делать это автоматически

0 голосов
/ 03 октября 2018

Готовое к использованию приложение Spring-boot, использующее инициализатор Spring (https://start.spring.io/)) будет правильно обрабатывать транзакции. Если вы создадите песочницу с модульным тестом, вы можете наблюдать, как разграничение транзакций выполняется в вашемПример создания транзакции. Вот мой пример с git hub: https://github.com/skjenco/hibernateSandbox.git

Код:

@Test
@Transactional
public void test() {

    logger.info(TransactionSynchronizationManager.getCurrentTransactionName());
    .....

Чтобы демаркация транзакции работала, вы должны находиться в объекте, управляемом Spring (Component)., Service, Managed Beans и т. Д.) В приведенном выше случае выясняется, что вы находитесь в управляемом сервисе Spring. Использование рабочей изолированной программной среды может помочь в устранении неполадок, связанных с вашей проблемой - это то, что я сделал для решения проблем с гибернацией.

0 голосов
/ 03 октября 2018

Какой класс вы используете для @Transactional?
Вы должны использовать org.springframework.transaction.annotation.Transactional.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...