JFinal

登录 注册

springboot使用jfinal orm,以及事物

db config

@Configuration
public class JFinalDbConfig {
	
	@Autowired
	@Qualifier("dataSource")
	private DataSource dataSource;
	 	@Bean
	@Primary
	public ActiveRecordPlugin activeRecordPlugin(){
		System.out.println(dataSource);
		ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(dataSource);
		_MappingKit.mapping(activeRecordPlugin);
		activeRecordPlugin.setShowSql(true);
		activeRecordPlugin.setDialect(new MysqlDialect());
		activeRecordPlugin.setTransactionLevel(4);
		activeRecordPlugin.start();
		return activeRecordPlugin;
	}

}


配置完后,就可以在springboot环境里使用jfinal 的db了,


事物配置:

@Component
@Scope
@Aspect
@Order(1)
public class JFinalTxAspect {

	private static final Logger logger = LoggerFactory.getLogger(JFinalTxAspect.class);

	@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
	public void JFinalTxAspect() {

	}

	@Around("JFinalTxAspect()")
	public Object around(ProceedingJoinPoint joinPoint) {
		Object obj = null;
		Config config = getConfigWithTxConfig(joinPoint);
		if (config == null)
			config = DbKit.getConfig();

		Connection conn = config.getThreadLocalConnection();
		if (conn != null) { // Nested transaction support
			try {
				if (conn.getTransactionIsolation() < getTransactionLevel(config))
					conn.setTransactionIsolation(getTransactionLevel(config));
				try {
					obj = joinPoint.proceed();
				} catch (Throwable e) {
					logger.error(e.getMessage(),e);
				}

			} catch (SQLException e) {
				throw new ActiveRecordException(e);
			}
		}

		Boolean autoCommit = null;
		try {
			conn = config.getConnection();
			autoCommit = conn.getAutoCommit();
			config.setThreadLocalConnection(conn);
			conn.setTransactionIsolation(getTransactionLevel(config)); // conn.setTransactionIsolation(transactionLevel);
			conn.setAutoCommit(false);
			obj = joinPoint.proceed();
			conn.commit();
			logger.info("Committing JDBC transaction on Connection [" + conn + "]");
		} catch (NestedTransactionHelpException e) {
			if (conn != null)
				try {
					conn.rollback();
					logger.info("Rolling back JDBC transaction on Connection [" + conn + "]");
				} catch (Exception e1) {
					logger.error(e1.getMessage(), e1);
				}
		} catch (Throwable t) {
			if (conn != null)
				try {
					conn.rollback();
					logger.info("Rolling back JDBC transaction on Connection [" + conn + "]");
				} catch (Exception e1) {
					logger.error(e1.getMessage(), e1);
				}
			throw t instanceof RuntimeException ? (RuntimeException) t : new ActiveRecordException(t);
		} finally {
			try {
				if (conn != null) {
					if (autoCommit != null)
						conn.setAutoCommit(autoCommit);
					logger.info("Releasing JDBC Connection [" + conn + "] after transaction");
					conn.close();
					
				}
			} catch (Throwable t) {
				logger.error(t.getMessage(), t); // can not throw exception
													// here, otherwise the more
													// important exception in
													// previous catch block can
													// not be thrown
			} finally {
				config.removeThreadLocalConnection(); // prevent memory leak

			}

		}
		return obj;
	}

	public static Config getConfigWithTxConfig(ProceedingJoinPoint joinPoint) {
		TxConfig txConfig = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(TxConfig.class);
		if (txConfig == null)
			txConfig =joinPoint.getTarget().getClass().getAnnotation(TxConfig.class);

		if (txConfig != null) {
			Config config = DbKit.getConfig(txConfig.value());
			if (config == null)
				throw new RuntimeException("Config not found with TxConfig: " + txConfig.value());
			return config;
		}
		return null;
	}

	protected int getTransactionLevel(Config config) {
		return config.getTransactionLevel();
	}

事物使用的是 spring的aop (aspectj),实现代码就是Tx.class里面照搬过来的,然后用spring自带的事物注解Transactional 就可以了

评论