ServiceFramework
ServiceFramework copied to clipboard
框架对时间格式的支持
@allwefantasy 不知道框架怎么处理时间格式的数据 mysql里用dateTime格式怎么存
根据Mysql 里字段的格式来决定。 通常Mysql 包含 date,datetime,timestamp 三种格式,他们都会被映射为 java.util.Date 类。 框架然后根据数据库字段的定义为字段加上注解。 比如这段代码:
public Tuple<Class, Map> dateType(String type, ConstPool constPool) {
type = type.toUpperCase();
EnumMemberValue emb = new EnumMemberValue(constPool);
emb.setType("javax.persistence.TemporalType");
if (type.equals("DATE")) {
emb.setValue("DATE");
return new Tuple<Class, Map>(Temporal.class, map("value", emb));
}
if (type.equals("DATETIME")) {
emb.setValue("DATE");
return new Tuple<Class, Map>(Temporal.class, map("value", emb));
}
if (type.equals("TIMESTAMP")) {
emb.setValue("TIMESTAMP");
return new Tuple<Class, Map>(Temporal.class, map("value", emb));
}
return null;
}
同时,ServiceFramework引入了joda-time的库处理时间。你可以了解了解。这是我目前觉得比较好用的java时间库。
@allwefantasy 这边我在数据库里有个dateTime字段createTime 在curl中传值createTime=2012-01-01但在create()以后 对象中createTime为空
还有个问题是 保存tag时 如果传值中有tag_synonym.id=1报错 参数填充可以填充进去 但是保存时有问题 Tag tag = Tag.create(params()); tag.save()
很多东西可以通过很简单的方式解决。通常比如struts是写一个convertor类,然后注册则就可以的,这其实是非常麻烦的。 对于哪个传递日期时间的问题,我会这么去做:
Tag tag = Tag.create(params());
我们发现其实create方法就是接受一个map 类型数据。 所以我们只要添加一个方法嵌套params方法就可以把字符窜转化为日期了。 比如:
private Date yyMMddConertor(Map map){
//在这里对params参数里的date日期进行格式化转换。
}
接着就可以这么写:
Tag tag = Tag.create(yyMMddConertor(params()));
将yyMMddConertor 放到ApplicationController中就可以全局用啦。
id 是不可以自己赋值的。因为id都是自增的。
@allwefantasy 在一对多的关系中 一的一端已经存了数据 然后再多的一端想再加数据 多的一端的外键值怎么进数据库 试了下 框架貌似保存不了
能不能贴出你的代码:
@Test
public void manyToOne() {
String tagName = "jack";
String tagSynonymName = "wowo";
TagSynonym tagSynonym = TagSynonym.create(map("name", tagSynonymName));
Tag tag = Tag.create(map("name", tagName));
tagSynonym.associate("tags").add(tag);
tagSynonym.save();
dbCommit();
tagSynonym = TagSynonym.where("name=:name", map("name", tagSynonymName)).single_fetch();
assertTrue(tagSynonym != null);
tag = Tag.where("name=:name", map("name", tagName)).single_fetch();
assertTrue(tag != null);
tagSynonym.delete();
tag.delete();
}
@Test
public void manyToOne2() {
String tagName = "jack";
String tagSynonymName = "wowo";
TagSynonym tagSynonym = TagSynonym.create(map("name", tagSynonymName));
tagSynonym.save();
dbCommit();
Tag tag = Tag.create(map("name", tagName));
tagSynonym.associate("tags").add(tag);
tagSynonym.save();
dbCommit();
tagSynonym = TagSynonym.where("name=:name", map("name", tagSynonymName)).single_fetch();
assertTrue(tagSynonym != null);
tag = Tag.where("name=:name", map("name", tagName)).single_fetch();
assertTrue(tag != null);
tagSynonym.delete();
tag.delete();
}
这是我的两个测试代码 ,证明可以级联保存。你关联对象的时候不能手动给某个对象设置id.比如你想关联一个id为10的tag,那么你需要先取出来,然后再进行对象关联。这是ORM进行关联的基本方式。
嗯 通过先查询然后把对象关联给多的一端可以保存