1
回答
请问下加了@Before(Tx.class)为什么还是主表插入了从表没有?
注册华为云得mate10,2.9折抢先购!>>>   

@JFinal 你好,想跟你请教个问题:

这个是代码:

/**
* 新增评论[文章]
*/
@Before(Tx.class)
public void insertCommentServer(Map<String,Object> map)
{
try {
Record comment = new Record().set("comment_user_id",map.get("comment_user_id"))
 .set("reply_user_id",null).set("content_id",map.get("content_id"))
 .set("site_id",map.get("site_id")).set("create_time",new Date())
 .set("reply_time",null).set("ups",0)
 .set("downs",0).set("is_recommend",0)
 .set("is_checked",1).set("score",null)
 .set("voteitem_id",map.get("voteitem_id"))
 .set("comment_parent_id",null);
Db.save("jc_comment",comment);
Record commentText=new Record().set("comment_id",comment.get("id")).set("text",HtmlTag.replaceHtmlTag(map.get("text").toString()))
  .set("reply",null).set("ip",map.get("ip"));
Db.save("jc_comment_ext",commentText);
} catch (Exception e) {
e.printStackTrace();
renderJson("{\"ERROR\":"+ErrorCode.DB.SAVE_ERROR+"\"\"MESSAGE\":\"insert comment error!\"}");
}
}

但是在[未知的]情况下会主表插入了;从表没有;


这个是报的错:


2015-10-24 23:38:23
[INFO]-[Thread: http-8081-5]-[com.jfinal.plugin.activerecord.SqlReporter.invoke()]: Sql: insert into `jc_comment`(`voteitem_id`, `create_time`, `downs`, `content_id`, `reply_user_id`, `reply_time`, `comment_user_id`, `comment_parent_id`, 


`score`, `is_recommend`, `site_id`, `ups`, `is_checked`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)


2015-10-24 23:38:23
[INFO]-[Thread: http-8081-5]-[com.jfinal.plugin.activerecord.SqlReporter.invoke()]: Sql: insert into `jc_comment_ext`(`ip`, `text`, `comment_id`, `reply`) values(?, ?, ?, ?)
com.jfinal.plugin.activerecord.ActiveRecordException: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\x98\xA8\xF0\x9F...' for column 'text' at row 1
 at com.jfinal.plugin.activerecord.DbPro.save(DbPro.java:545)
 at com.jfinal.plugin.activerecord.DbPro.save(DbPro.java:555)
 at com.jfinal.plugin.activerecord.Db.save(Db.java:380)
 at com.base.service.MobileNewsApiService.insertCommentServer(MobileNewsApiService.java:178)
 at com.base.mobile.NewsDetailsController.publishComment(NewsDetailsController.java:137)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:497)
 at com.jfinal.aop.Invocation.invoke(Invocation.java:71)
 at com.core.interceptor.AppLoginInterceptor.intercept(AppLoginInterceptor.java:25)
 at com.jfinal.aop.Invocation.invoke(Invocation.java:65)
 at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
 at com.jfinal.ext.handler.FakeStaticHandler.handle(FakeStaticHandler.java:56)
 at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
 at java.lang.Thread.run(Thread.java:745)
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\x98\xA8\xF0\x9F...' for column 'text' at row 1
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3534)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3468)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1957)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2107)
 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
 at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2086)
 at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371)
 at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2289)
 at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2274)
 at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:253)
 at com.jfinal.plugin.activerecord.DbPro.save(DbPro.java:509)
 at com.jfinal.plugin.activerecord.DbPro.save(DbPro.java:543)
 ... 27 more

<无标签>
举报
慕容小伟
发帖于2年前 1回/501阅
共有1个答案 最后回答: 2年前

   两个表的操作是在 try catch 之中的,而 catch 中处理后并没有继续抛出异常,所以 @Before(Tx.class) 无法感知异常,所以不会回滚事务,造成前表保存成功,后表没有。

   另外,异常信息为:Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\x98\xA8\xF0\x9F...' for column 'text' at row 1,表明不合法的数据试图保存在 text 字段中,保障数据正确就好。

--- 共有 2 条评论 ---
JFinal回复 @慕容清风 : 如果确实需要在 catch 中处理些事情,就可以要,然后可以通过再次抛出异常来解决问题,如果需要在 catch 块中应用 render 之类的控制行为,可以让 @Before(Tx.class) 在业务层中使用,注意看一下 jfinal 2.0 手册中的业务层 aop 的用法 2年前 回复
慕容小伟那是不是我用了@Before(Tx.class) try catch就不需要了? 2年前 回复
顶部