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 就可以了

评论区

JFinal

2019-01-24 15:12

JFinalTxAspect 这个是特色,以往的分享里面没有这个,感谢分享

快乐的蹦豆子

2019-01-24 16:27

这个很赞

快乐的蹦豆子

2019-01-24 17:32

有一个问题,如果返回json, 怎么解析jfinal model的,自己注册的解析器还是返回的string

caoxusheng

2019-01-24 17:46

@快乐的蹦豆子 @ResponseBody 跟平常用spring没区别

快乐的蹦豆子

2019-01-25 09:07

@caoxusheng 对于多表联合查询的model是有问题的,他没办法把所有字段都转化出来

caoxusheng

2019-01-25 12:10

@快乐的蹦豆子 这个就要请求波总了。@JFinal

caoxusheng

2019-01-25 12:11

@JFinal 用Model进行关联查询的时候,没有get set的字段读取不出来

快乐的蹦豆子

2019-01-25 14:14

@caoxusheng https://www.jfinal.com/share/1405 看我这个把

suxiaoqiuking

2019-01-28 14:25

如果注解@Transactional写在类上面而方法上没写这个注解的话,这个事物是不生效,这个注解只能放在方法上,这个以前我就已经遇到过了,你可以试试怎么优化这个东西