jfinal_demo2.0 在Postgresql下运行,id自增字段写入错误问题

JonL 发布于 2015/06/22 12:55
阅读 1K+
收藏 2

@jFinal 自从转管理,10年不撸码,一撸就伤神。

喜见jFinal2.0  下载最新的jfinal_demo 先修改sql为PostgreSQL支持。


DROP TABLE blog;
CREATE TABLE blog (
  id SERIAL NOT NULL,
  title varchar(200) NOT NULL,
  content text NOT NULL,
  primary key (id)
) ;

INSERT INTO blog VALUES (DEFAULT, 'JFinal Demo Title here', 'JFinal Demo Content here');
INSERT INTO blog VALUES (DEFAULT, 'test 1', 'test 1');
INSERT INTO blog VALUES (DEFAULT, 'test 2', 'test 2');
INSERT INTO blog VALUES (DEFAULT, 'test 3', 'test 3');
INSERT INTO blog VALUES (DEFAULT, 'test 4', 'test 4');
INSERT INTO blog  ("title","content") VALUES ( 'test 5', 'test 5');

然后参考手册修改DemoConfig.java使用Postgresql

……
c3p0Plugin.setDriverClass("org.postgresql.Driver");
……
arp.setDialect(new PostgreSqlDialect());



启动Tomcat后JFinal Demo Blog应用可以正常启动。但做增加操作时sql插入语句,id这个自增主键是null值。Postgresql不允许null。 请问是否有其他方言参数设置用于兼容这一情况?如果没有参数设置是否需要在Blog.java 中重写save()方法?
加载中
1
JFinal
JFinal

引用来自“JonL”的评论

引用来自“JFinal”的评论

突然看到你的 JFinal action report 中的 parameter 中有blog.id=null,界面应该用了一个 <input name="id" /> 既然自增主键就不用为 id 赋值了,去掉这个 input ,或者这样 getModel(...).remove("id") 即可打完收工

感谢波波解答。我先尝试用第一种方法,直接去掉 _form.html 中的<input name="id"> 由于这个页面同样由修改调用,目测改完后新增功能可行,修改功能会挂掉,果然500错误。 后新增一个页面_form_add.html没有id值专供add.html调用。成功。

测试第二种方法,视图页面不改情况下在BlogController.java 的save()方法中调用getModel(Blog.class).save();前增加getModel(Blog.class).remove("id"); 测试失败。

	@Before(BlogValidator.class)
	public void save() {
		getModel(Blog.class).remove("id");
                getModel(Blog.class).save();
		redirect("/blog");
	}



看代码Model.java中 remove 方法返回泛型。顾将代码改为getModel(Blog.class).remove("id").save();测试成功。 

	@Before(BlogValidator.class)
	public void save() {
		getModel(Blog.class).remove("id").save();
		redirect("/blog");
	}




对java理解不深,搞不清楚分前后写getModel(Blog.class)引用的不是同一个对象实例?

     刚刚测试了一下 jfinal demo,在 mysql 之下,即便是为 id 赋了值,也工作正常,看来是 postgresql 特有的问题, 多次调用 getModel 是生成的不同的对象。

    所以在 postgresql 下最终解决办法是使用 getModel(...).remove("id").save()

0
JFinal
JFinal

建表sql 改成这样试试:

DROP TABLE blog;
CREATE TABLE blog (
  id SERIAL primary key,
  title varchar(200) NOT NULL,
  content text NOT NULL
);



0
JonL
JonL

引用来自“JFinal”的评论

建表sql 改成这样试试:

DROP TABLE blog;
CREATE TABLE blog (
  id SERIAL primary key,
  title varchar(200) NOT NULL,
  content text NOT NULL
);



按这建表语句测试了,结果一样的。其实这个新语句和原来的没有本质区别吧?设为主键的字段默认为非空的。

JFinal action report -------- 2015-06-22 16:13:07 ------------------------------
Controller  : com.demo.blog.BlogController.(BlogController.java:1)
Method      : save
Interceptor : com.demo.blog.BlogInterceptor.(BlogInterceptor.java:1)
              com.demo.blog.BlogValidator.(BlogValidator.java:1)
Parameter   : blog.id=  blog.title=test 6  blog.content=test 6  
--------------------------------------------------------------------------------
Before invoking /blog/save

2015-06-22 16:13:07
[ERROR]-[Thread: http-nio-8080-exec-2]-[com.jfinal.core.ActionHandler.handle()]: /blog/save
com.jfinal.plugin.activerecord.ActiveRecordException: org.postgresql.util.PSQLException: 错误: 在字段 "id" 中空值违反了非空约束
  详细:失败, 行包含(null, test 6, test 6).
	at com.jfinal.plugin.activerecord.Model.save(Model.java:375)
	at com.demo.blog.Blog.save(Blog.java:40)
	at com.demo.blog.BlogController.save(BlogController.java:22)
	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:483)



0
JFinal
JFinal
突然看到你的 JFinal action report 中的 parameter 中有blog.id=null,界面应该用了一个 <input name="id" /> 既然自增主键就不用为 id 赋值了,去掉这个 input ,或者这样 getModel(...).remove("id") 即可打完收工
0
JonL
JonL

引用来自“JFinal”的评论

突然看到你的 JFinal action report 中的 parameter 中有blog.id=null,界面应该用了一个 <input name="id" /> 既然自增主键就不用为 id 赋值了,去掉这个 input ,或者这样 getModel(...).remove("id") 即可打完收工

感谢波波解答。我先尝试用第一种方法,直接去掉 _form.html 中的<input name="id"> 由于这个页面同样由修改调用,目测改完后新增功能可行,修改功能会挂掉,果然500错误。 后新增一个页面_form_add.html没有id值专供add.html调用。成功。

测试第二种方法,视图页面不改情况下在BlogController.java 的save()方法中调用getModel(Blog.class).save();前增加getModel(Blog.class).remove("id"); 测试失败。

	@Before(BlogValidator.class)
	public void save() {
		getModel(Blog.class).remove("id");
                getModel(Blog.class).save();
		redirect("/blog");
	}



看代码Model.java中 remove 方法返回泛型。顾将代码改为getModel(Blog.class).remove("id").save();测试成功。 

	@Before(BlogValidator.class)
	public void save() {
		getModel(Blog.class).remove("id").save();
		redirect("/blog");
	}




对java理解不深,搞不清楚分前后写getModel(Blog.class)引用的不是同一个对象实例?

JFinal
JFinal
不是在 getModel(..).save() 前增加那行代码,而是直接用新的代码取代它
0
NotFoundException
NotFoundException
@JFinal 我之前也碰到这个问题;解决方式是blog.setAttr("title");blog.setAttr("content");  在保存,这样Id就不会为空了,手动设置值就可以了
0
JFinal
JFinal

引用来自“NotFoundException”的评论

@JFinal 我之前也碰到这个问题;解决方式是blog.setAttr("title");blog.setAttr("content");  在保存,这样Id就不会为空了,手动设置值就可以了
先 getModle(...) 再 remove(id) 这样省事多了
返回顶部
顶部