Hace un tiempo, me hice cargo de un proyecto desarrollado usando Springboot y Spring-Data-JPA. Más tarde, se agregó un nuevo amigo, diciendo que JPA es demasiado difícil de usar que MyBatis, y también es difícil escribir una consulta con múltiples tablas, por lo que agregué el soporte de mybatis.
Al principio
@Configuration@enableJParepositories ("com.xxx.xxx.repository") clase JPAConfigAl usar este método para configurar JPA, un problema encontrado es que puede seleccionar pero no puede guardar, por lo que se modifica en el archivo de configuración:
Lo siguiente presenta directamente el archivo de configuración:
1. Configuración de resorte
<? xml versión = "1.0" encoding = "utf-8"?> <frijoles xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschem A-Instance "xmlns: context =" http://www.springframework.org/schema/context "xmlns: tx =" http: // www. springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:task = "http://www.springframework.org/schema/task" xsi: schemalocation = "http: //www.springframework.or g/schema/beansshttp: //www.springframework.org/schema/beans/spring-beans.xsdhttp: //www.springframework.or g/schema/context/spring-context.xsdhttp: //www.springframework.org/schema/context/spring-context.xsdhttp : //www.springframework.org/schema/txhttp: //www.springframework.org/schema/tx/spring-tx.xsdhtt p: //www.springframework.org/schema/aophttp: //www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"><!-- escanea el archivo de anotación-> <context: context: component-scan-package = "com.xxx"/> <tasks: annotation-drotation-droation id = "SpringContexTholder" Lazy-init = "False"> </bean> <bean id = "configProperties" class = "org.springframework.beans.factory.config.propertiesfactorybean"> <propiedad name = "ubicaciones"> <list> <value> classpath*: jdbc.properties </value> <value> classpath*: app.properties </value> </list> </property> </bean> <bean id = "PropertyConfigurer" class = "Org.springfframework.beanss.factory.config.preferences PlaceHolderConfigurer" <class = "Org.springfframeWork name = "SystemPropertiesModeName" value = "System_Properties_Mode_Override"/> <Property name = "fileEncoding" value = "utf-8"/> <propiedad name = "Properties" ref = "configurproperties"/> </bean> <!-DataSource Configuration-> <bean id = "dataSource" URL de propiedades, usuario, contraseña-> <!-<propiedad name = "DriverClassName" value = "$ {ds.driverClassName}"/>-> <Property name = "url" value = "$ {ds.url}"/> <Property name = "username" value = "$ {ds.Username}"/> <sperty name = "Passions" Value = "$ {ds.way}" Configurar el tamaño de la inicialización, el mínimo y el máximo-> <propiedad name = "inicialsize" value = "$ {ds.initialSize}"/> <propiedad name = "minidle" value = "$ {ds.minidle}"/> <propiedad name = "value" valor = "$ {ds.maxactive}"/> <<! name = "maxwait" value = "$ {ds.maxwait}"/> <!-Configure cuánto tiempo lleva verificar una vez, detectar la conexión inactiva que debe cerrarse, en MilliseConds-> <Propiedad name = "TimeBetweenEvictionRunsMillis" Value = "$ {Ds.TimeBetSeVictionRunsmillis}"/> <!-Configure el Minimum de Time en la intermedia de la intermedia de Time en el Time en el Time en la Piscina en el Tiempo de Tiempo de Time en la Piscina a la Piscula a la Piscula a la Piscula a la Piscula a la Piscula a la Piscula en el Tiempo de Tiempo de Tiempo de Tiempo de Tiempo de Tiempo de Tiempo de Tiempo en la Piscula. MilliseConds-> <Property name = "mineVictableDletImEmillis" value = "$ {ds.MineVictableDletImemillis}"/> <Property name = "ValidationQuery" valor = "$ {ds.ValidationQuery}"/> <name de propiedad = "testWhileidle" value = "$ {ds.testwhileidle}/> <ser valor = "$ {ds.testonborrow}"/> <propiedad name = "testOnreturn" value = "$ {ds.testonreturn}"/> <!-abra pscache y especifique el tamaño de pscache en cada conexión-> <name de propiedad = "PoolPreparedStatements" value = "$ {ds.PoolProparedStatements}"/> <propiedad de propiedad name = "maxPoolPreparedStatEmentPonConnectsize" value = "$ {ds.maxPoolPreparedStatementPonConnectsize}"/> <!-Configure los filtros para monitorear las intercepciones de estadísticas-> <Property Name = "Filters" Value = "$ {ds.filters}"/> < value = "$ {ds.logabandoned}"/> </bean> <!-spring y mybatis están perfectamente integrados, y el archivo de asignación de configuración de mybatis no requiere mybatis-> <bean id = "sqlsessionFactory"> <Property name = "dataSource" ref = "dataSource"/> <name de propiedad = "configuración" de configuración "" Configuración "" Configuración "" Configuración " value = "classpath: mybatis-config.xml"/> <propiedad name = "typealiaspackage" value = "com.xxx.culture.domain"/> <!-escanear automáticamente el archivo mappes.xml-> <Property name = "mapperLocations" value = "classpath: mapper/**/*. xml"/> </</"n. Ubicado, Spring encontrará automáticamente la clase en él-> <Bean> <Property Name = "BasePackage" Value = "com.xxx.xxx.dao"/> </aun> <!-(Transaction Management) Manager de transacciones, use JTatransactionManager para Global Tx-> < id = "transaccionManager" class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <propiedad name = "dataSource" ref = "dataSource"/> </ bean> <!-Notificación de administración de transacciones-> <tx: consejo id = "txadvice" Transaction-manager = "TransactionManager"> <tx: TX: Attibutes: Attibutes: Attributes:-ATSACTIONE < Métodos que comienzan con insertar, actualizar, eliminar, regresar siempre que haya una excepción-> <tx: name de método = "inserto*" propagation = "requerido" reversión "java.lang.throwable"/> <tx: método name = "update*" propagation = "requerido" reversión-for = "java.lang.throwable"/> <tx: method name = "deletete*" propagation "requerido =" requerido " Rollback-For = "java.lang.throwable"/> <tx: método name = "remove*" propagation = "requirido" rollback-for = "java.lang.throwable"/> <tx: método name = "salvar*" propagation = "requirido" rejode-for = "java.lang.throwable"/> <tx: método name = "add*" propagation " name = "flush*" propagation = "requerido"/> <!-El método que comienza con select, count, get, busca, habilita lectura a la sola read Only = "True"/> <tx: Method name = "find*" read-Only = "true"/> <tx: método name = "search*" read-only = "true"/> <!-Use la administración de transacciones predeterminada para otros métodos-> <tx: método name = "*"/> </tx: Attributes> </tx: consejo> <!-Transacción de configuración AOP AOP AOP AOP AOP com.xxx.smp.service ..*impl.*(..))-> <aop: config> <aop: pointCut id = "ServiceMethods" Expression = "Ejecution (*com.xxx.xxx.service ..*(..))"/> <aop: asesor-consejo-ref = "txadvice" PointCut-ref = "ServiceMethods"/> </aop: config> <!-Configurar Spring para usar cglib proxy-> <aop: spectj-auteoproxy proxy-target-class = "true"/> <! Resource = "ApplicationContext-JPA.xml"/> </le beans>2. Configuración de JPA
Encontré un problema al principio: jpa org.hibernate.lazyinitializationException: no pudo inicializar el proxy - sin sesión
La configuración es la siguiente
<? xml versión = "1.0" encoding = "utf-8"?> <frijoles xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: tx = "http: //wwww.springframewoc rk.org/schema/tx"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemalocation="http://www.springfframework.org/beans/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" ><bean id = "EntityManagerFactory" class = "org.springframework.orm.jpa.localContainerEntityManagerFactoryBean"> <!-Especifique la fuente de datos-> <propiedad name = "DataSource" ref = "DataSource"/> <!-Especifique la ruta de la clase de entidad-<Property Property name = "PackageScan"> <list> <value> com.xxx.xxx.jpadomain </value> </list> </property> <!- Especifique el atributo JPA; como si se debe mostrar SQL, Dialect, etc. en Hibernate-> <Property name = "jpavendorAdapter"> <Bean> <!-si se debe generar archivo ddl-> <name de propiedad = "generado" valor = "true"/> <!-si se muestra sql-> <nombre de propiedad name = "shoSql" valor = "falso"/> <!-Detalles de los detalles de la biblioteca necesaria de la biblioteca necesaria. name = "databasePlatform" value = "org.hibernate.dialect.mysqldialect"/> <!-mysql, seleccione por usted mismo-> <name de propiedad = "base de datos" value = "mysql"/> </bean> </propiedad> <propers name = "jpaproperties"> <props> <props> key = "hibernate.ejb.naming_strategy"> org.hibernate.cfg.improvednamingninggy </prop> <proppt key = "hibernate.hbm2ddl.auto"> update </prop> <prop key = "hibebernate.enable_lazy_load_no_trans"> verdadero </prop> <propS </props </props. Spring Data Configuración JPA-> <!-Configure la función de habilitar el escaneo y la creación automáticamente de proxy fábricas class = "com.monk.base.jpa.peakjparpositoryfactory" Método de anotación de frijoles definido por sí mismo. Puede anotar directamente todos los paquetes sin escribir-> <jpa: repositories base-package = "com.xxx.xxx.repository" transaction-manager-ref = "transaccionManager" entity-manager-factory-ref = "entityManagerFactory"/> <!-JPA Transaction Configuration-Configuration-Configuration-> <<beay " name = "EntityManagerFactory" ref = "entityManagerFactory"/> </bean> <!-activar la transacción de anotación-> <tx: transacción-manager-manager de anotación = "transaccionManager" proxy-target-class = "true"/> </beans>
Lo anterior es un análisis de los problemas encontrados en la integración de Spring JPA y MyBatis presentados por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!