﻿{"id":513,"date":"2019-10-02T19:57:05","date_gmt":"2019-10-02T11:57:05","guid":{"rendered":"http:\/\/blog.sway.com.cn\/?p=513"},"modified":"2019-10-02T19:57:05","modified_gmt":"2019-10-02T11:57:05","slug":"%e9%85%8d%e7%bd%aespringboot%e7%9a%84%e5%85%a8%e5%b1%80%e4%ba%8b%e5%8a%a1%ef%bc%8c%e8%a7%a3%e5%86%b3%e5%9c%a8controller%e4%b8%ad%e4%bd%bf%e7%94%a8sessionfactory%e5%bf%85%e9%a1%bb%e8%a6%81%e4%bd%bf","status":"publish","type":"post","link":"http:\/\/blog.sway.com.cn\/?p=513","title":{"rendered":"\u914d\u7f6eSpringBoot\u7684\u5168\u5c40\u4e8b\u52a1\uff0c\u89e3\u51b3\u5728Controller\u4e2d\u4f7f\u7528SessionFactory\u5fc5\u987b\u8981\u4f7f\u7528\u6ce8\u89e3@Transactional\u7684\u95ee\u9898"},"content":{"rendered":"<p>\u589e\u52a0\u4ee5\u4e0b\u4e24\u4e2a\u914d\u7f6e\u6587\u4ef6\uff1a<\/p>\n<p>TransactionAdviceConfig.java<\/p>\n<pre class=\"lang:default decode:true  \">package com.zero4j.config;\r\n\r\n\r\nimport org.aspectj.lang.annotation.Aspect;\r\nimport org.springframework.aop.Advisor;\r\nimport org.springframework.aop.aspectj.AspectJExpressionPointcut;\r\nimport org.springframework.aop.support.DefaultPointcutAdvisor;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.context.annotation.Configuration;\r\nimport org.springframework.transaction.PlatformTransactionManager;\r\nimport org.springframework.transaction.TransactionDefinition;\r\nimport org.springframework.transaction.interceptor.DefaultTransactionAttribute;\r\nimport org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;\r\nimport org.springframework.transaction.interceptor.TransactionInterceptor;\r\n\r\n@Aspect\r\n@Configuration\r\npublic class TransactionAdviceConfig {\r\n\r\n\t \/\/\u4f7fdao\u4f7f\u7528session\r\n\tprivate static final String AOP_POINTCUT_EXPRESSION = \" (execution(* com..dao..*.*(..))) \";\r\n\t\/\/controller\u7531\u8fc7\u6ee4\u5668\u4e2d\u8fdb\u884c\u8bbe\u7f6e\uff0c\u8fd9\u91cc\u8bbe\u7f6e\u4f1a\u62bd\u98ce\r\n\t\/*private static final String AOP_POINTCUT_EXPRESSION2 = \" (execution(* com..controller..*.*(..))) \";*\/\r\n\t \r\n\t \r\n    @Autowired\r\n    private PlatformTransactionManager transactionManager;\r\n\r\n    @Bean\r\n    public TransactionInterceptor txAdvice() {\r\n\r\n        DefaultTransactionAttribute txAttr_REQUIRED = new DefaultTransactionAttribute();\r\n        txAttr_REQUIRED.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);\r\n\r\n        DefaultTransactionAttribute txAttr_REQUIRED_READONLY = new DefaultTransactionAttribute();\r\n        txAttr_REQUIRED_READONLY.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);\r\n        txAttr_REQUIRED_READONLY.setReadOnly(true);\r\n        \r\n        \r\n        DefaultTransactionAttribute txAttr_READONLY = new DefaultTransactionAttribute();\r\n        txAttr_READONLY.setReadOnly(true);\r\n        \r\n        \r\n\r\n        NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();\r\n\r\n        source.addTransactionalMethod(\"save*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"add*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"create*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"insert*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"update*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"merge*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"del*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"remove*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"put*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"use*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"exec*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"set*\", txAttr_REQUIRED);\r\n        \r\n        \r\n        source.addTransactionalMethod(\"get*\", txAttr_REQUIRED_READONLY);\/\/\u7279\u6b8a\uff0cservice\u5728save\u540e\u4f1a\u91cd\u65b0\u8bfb\u53d6\uff0c\u5982\u679c\u8bbe\u7f6e\u6210REQUIRED_READONLY,\u5219save\u4e0d\u4f1a\u4fdd\u5b58\u6570\u636e\r\n        source.addTransactionalMethod(\"count*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"find*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"list*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"query*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"find*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"is*\", txAttr_REQUIRED_READONLY);\r\n        \r\n        \/*\r\n        source.addTransactionalMethod(\"save*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"delete*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"update*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"exec*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"set*\", txAttr_REQUIRED);\r\n        source.addTransactionalMethod(\"get*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"query*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"find*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"list*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"count*\", txAttr_REQUIRED_READONLY);\r\n        source.addTransactionalMethod(\"is*\", txAttr_REQUIRED_READONLY);\r\n        \r\n        *\/\r\n        source.addTransactionalMethod(\"*\", txAttr_READONLY);\r\n        return new TransactionInterceptor(transactionManager, source);\r\n    }\r\n\r\n    @Bean\r\n    public Advisor txAdviceAdvisor() {\r\n        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();\r\n        pointcut.setExpression( AOP_POINTCUT_EXPRESSION );\r\n        return new DefaultPointcutAdvisor(pointcut, txAdvice());\r\n    }\r\n    \r\n   \/* @Bean\r\n    public Advisor txAdviceAdvisor2() {\r\n        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();\r\n        pointcut.setExpression( AOP_POINTCUT_EXPRESSION2 );\r\n        return new DefaultPointcutAdvisor(pointcut, txAdvice());\r\n    }*\/\r\n}<\/pre>\n<p>FilterConfig.java<\/p>\n<pre class=\"lang:default decode:true \">package com.zero4j.config;\r\n\r\n\r\nimport org.aspectj.lang.annotation.Aspect;\r\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.context.annotation.Configuration;\r\nimport org.springframework.orm.hibernate5.support.OpenSessionInViewFilter;\r\n\r\n@Aspect\r\n@Configuration\r\npublic class FilterConfig {\r\n\r\n\t\/\/\u89e3\u51b3\u8c03\u7528\u63a5\u53e3\u65f6session\u62bd\u98ce\u7684\u95ee\u9898\r\n\t@Bean\r\n\tpublic FilterRegistrationBean&lt;OpenSessionInViewFilter&gt; testFilterRegistration() {\t\r\n\t\tFilterRegistrationBean&lt;OpenSessionInViewFilter&gt; registration = new FilterRegistrationBean&lt;&gt;();\r\n\t\tregistration.setFilter(new OpenSessionInViewFilter());\r\n\t\tregistration.addUrlPatterns(\"\/*\");\/\/\u914d\u7f6e\u8fc7\u6ee4\u8def\u5f84\r\n\t\treturn registration;\r\n\t}\r\n\t\r\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u589e\u52a0\u4ee5\u4e0b\u4e24\u4e2a\u914d\u7f6e\u6587\u4ef6\uff1a TransactionAdviceConfig.java package com.ze [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[167],"tags":[168,175,176],"class_list":["post-513","post","type-post","status-publish","format-standard","hentry","category-springboot","tag-springboot","tag-transactional","tag-176"],"_links":{"self":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=513"}],"version-history":[{"count":1,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/513\/revisions"}],"predecessor-version":[{"id":514,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/513\/revisions\/514"}],"wp:attachment":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=513"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}