阅读:10631次
评论:10条
更新时间:2011-05-26
Nutz.Dao 实体注释(Entity Annotation)一览表
Annotation | 描述 |
@Table | 类对象声明,表示一个 POJO 为一个Nutz.Dao可接受的对象,可以对应数据表或者视图 @Table("表或者视图名") 如果不声明值,那么 Nutz.Dao 将把该对象的 getClass().getSimpleName().toLowerCase() 作为数据表的名称 |
@View | 声明一个实体的时候,有些时候你需要将它存在某一个Table中,但是你却希望从一个View中获取。 这么做通常是希望View可以帮你做一些数据的统计方面的工作。Nutz.Dao 支持你为一个实体 声明一个 @Table 的同时也声明一个 @View,对于一个对象, Nutz.Dao的“增,删,改”操作将针对Table,而“查”操作将针对 View。 实际上,如果你没有声明 @View, 那么你声明的@Table 将作为@View 的默认设置。 |
@Column | 字段声明,表示当前字段可以被映射到数据库中, @Column("字段名") 可以指定到特定的数据库字段, 如果不指定,那么将采用 field.getName()作为名字,大小写是否敏感将依各个不同的数据库来定。 |
@Id | 字段声明,告诉 Nutz.Dao本字段将作为一个 ID来使用。默认的, Nutz.Dao将在每次向数据库中插入一个对象后,更新一下Id 字段的值,因为它认为@Id 字段是默认自动增长的。如果想消除这个特性,由你自己来控制@Id字段的值,请这样 @Id(IdType.STATIC) 来声明你的 ID 字段 |
@Name | 字段声明,告诉Nutz.Dao 本字段将作为一个Name来使用。一个实体的@Name 一般在数据表中都会做了唯一性约束。 所以当你依靠 @Name 来获取一个对象的时候,相当于
SELECT * FROM table WHERE name='...'; |
@NotNull | 字段声明, 如果你试图 Nutz.Dao 插入或者更新一个对象,给该字段赋null值将导致一个com.zzh.dao.FailToMakeSQLException |
@Default | 字段声明,告诉 Nutz.Dao 本字段默认的值。 @Default("你的默认值") 这个默认值你可以写成动态的,比如 @Default("${name}@abc.com") 当你插入的对象包括一个name 属性,这个属性值会替换 ${name} 否则会用 ""(空串) 来替换 ${name} |
@Readonly | 声明成Readonly的字段在插入和更新时将被忽略 |
@One |
在一个字段上声明一条一对一映射,这个声明需要你输入两个参数:
|
@Many |
声明一条多对多映射,这个声明需要你输入三个参数,其中一个是可选的:
注意, @Many 是一个略微让人疑惑的名称,你可能会想,你声明 @Many 的字段必须是一个容器或者数组,其实,它也可以是一个单个对象。对于 Nutz.Dao来说,@Many字段确切的意义是说:参考字段(@Many.field) 是存放在 target 对象里的,而 @One则表示参考字段是存放在当前对象的。 所以@Many 的确切意思是说“Can be Many”,因此你甚至可以这么写@Many(target=A.class,field="id")private A a;那么你通过 dao.fetchMany() 将只返回一个结果。 |
@ManyMany |
多对多的关联是数据库非常常见的一种设计,两个数据表通过第三张数据表进行关联,同@One 和 @Many 一样, Nutz.dao 提供了一个 @ManyMany 的声明,需要你输入五个参数,其中一个也是可选的:
这里需要说明的是, 两个对象的关联是通过 Id 或者 Name 来关联的,关联的优先级为:
就是说,如果主对象有 @Id 优先通过 @Id 来代表主对象,那么关联表代表主对象的字段必须为整数。 |
@Type | 虽然Nutz.Dao 通过 Java 的反射,在绝大多数情况下能知道怎么处理你的对象,但是对于某些类型,比如枚举类型,它就不知道怎么处理了,在数据库中到底保存成数字还是保存成字符串 呢? Nutz.Dao 在设计被要求自己不能通过访问数据表来获取如何操作数据库的知识,这个要求有助于将来进一步为其设计一些帮助工具,而且在绝大多数情况下,它也不需要去访 问数据库。所以这里不得不增加一个新的声明,@Type 就是用来明确指定一个字段在数据库里需要保存成什么类型的。不过,在 Nutz.Dao 的第一版,@Type 只会对枚举类型发生作用,如果你不声明 @Type,那么你的枚举字段是按照字符的形式存放在数据库中的,但是你可以用 @Type(Types.INT) 来告诉 Nutz.Dao你要把这个枚举字段按照数字的方式存放在数据库中, 值则是枚举值的 ordinal() |
10 楼 zozoh 2009-06-02 11:56
9 楼 lfapex 2009-06-02 11:32
8 楼 zozoh 2009-05-23 14:55
周末在家,不方便调试,不过看了下代码,好像都是用的prepareStatement,没有使用调存储过程用的CallableStatement,好在开源可以自己加。另外以前用ibatis时,动态sql用得还是比较多的,虽然目前项目不需要,所有动态的都在存储过程里实现,还是请楼主权衡对存储过程和动态sql的支持是否有必要。
谢谢,我已经报了个issue: http://code.google.com/p/nutz/issues/detail?id=36
在 beta 版之前我会修复它
7 楼 Leapiny 2009-05-23 08:54
6 楼 zozoh 2009-05-22 22:32
晕,楼主响应也太快了,刚把Nutz_Dao_Book.pdf下来,仔细研究下,最近需要做个小项目,大多数逻辑都在数据库的存储过程上。 谢谢楼主。
如果调用不成,或者有什么好建议,让我知道
5 楼 Leapiny 2009-05-22 21:37
4 楼 zozoh 2009-05-22 21:32
自己写个 SQL 在里面执行就成了。如何在 Nutz 中自己写 SQL,请参看这篇贴:
http://zozoh.javaeye.com/blog/393739
3 楼 Leapiny 2009-05-22 21:25
2 楼 zozoh 2009-05-22 11:09
1 楼 nanquan 2009-05-22 11:03