@Transactional proxyTargetClass и @Inherited - PullRequest
0 голосов
/ 23 октября 2018

У меня есть 2 вопроса, на которые я не могу найти ответы для них относительно @Transactional:

1- @Transnational по интерфейсу
согласно ответам:

Если выустановите для вашего приложения значение proxy-target-class = 'true' (в контексте вашего приложения ваша @Transactional информация не будет получена, если вы аннотируете интерфейс.

Я настроил мои application.propertiesс помощью:

spring.aop.proxy-target-class=true

и аннотации на интерфейсе все еще подобраны, я пробовал также следующее (proxyTargetClass = true на EnableTransacationManagement):

@SpringBootApplication
@EnableAsync
@EnableTransactionManagement(proxyTargetClass = true)
public class Application extends SpringBootServletInitializer {
}

все еще @Transnational являетсяработая там, где я настраиваю только интерфейс, так чего мне здесь не хватает?

2- @Transnational имеет @Inherited, @inherited согласно документу java:

Обратите внимание, чтоэтот тип метааннотации не действует, если аннотированный тип используется для аннотирования чего-либо, кроме класса. Также обратите внимание, что эта метааннотация только приводит к тому, что аннотации наследуются только от суперклассов;интерфейсы не имеют никакого эффекта.

У меня есть следующий интерфейс, аннотированный @Transnational, и он все еще работает с интерфейсами, расширяющими его:

@Repository
@Transactional
public interface UserRepository extends JpaRepository<User, Long> {


}

Следующий / ниже интерфейс имеет модифицирующий запростам, где он не будет работать без @Transactional, я аннотировал интерфейс выше с помощью @Transacational, и его подбирают (он даже работает, если я настраиваю на родительские методы вместо класса):

public interface TestRepository extends UserRepository {

@Query("UPDATE User U set U.name='hello' where U.id=1")
@Modifying
public void test();

}

Так как же работала транзакция, если @Inherited не влияет на интерфейс?


Обновление: для вопроса 1

Я дажепробовал @Async на методе интерфейса, и он работал без аннотирования класса реализации, AOP работает с прокси CGLIB (только при аннотировании методов интерфейса), это противоречит большинству ответов, которые не уверены, что что-то не так.

1 Ответ

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

Ответ, на который вы ссылаетесь, относится к Spring 3.0, однако в настоящее время мы находимся на Spring 5.1.Это примерно на 7 версий вперед, и этот раздел справочного руководства больше не существует.

Неважно, в каком режиме прокси вы используете Spring, всегда будет пытаться найти аннотацию @Transactional на интерфейсах реализации, если она не найдена в реализации.Это поведение Spring, специально реализованное в Spring, которое отличается от правил наследования аннотаций по умолчанию.(Обычно при выполнении getAnnotation это не сработает, поэтому Spring реализовал это).См. Также этот раздел справочного руководства Spring.

Кроме того, вы также используете Spring Data JPA, который также добавляет метаданные и обработку аннотаций специально для создаваемых им динамических репозиториев.

...