实体注释(Entity.doc

上传人:peixunshi 文档编号:15034151 上传时间:2022-03-06 格式:DOC 页数:12 大小:170.50KB
返回 下载 相关 举报
实体注释(Entity.doc_第1页
第1页 / 共12页
实体注释(Entity.doc_第2页
第2页 / 共12页
实体注释(Entity.doc_第3页
第3页 / 共12页
实体注释(Entity.doc_第4页
第4页 / 共12页
实体注释(Entity.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《实体注释(Entity.doc》由会员分享,可在线阅读,更多相关《实体注释(Entity.doc(12页珍藏版)》请在三一文库上搜索。

1、专栏首页f Java编程f Java综合f专栏:nutz 专栏f章节:数据持久 化-Nutz.DaoNutz.Dao 实体注释(EntityAnno tati on)览表阅读:618次 评论:10条 更新时间:2009-05-05Nutz.Dao 实体注释(Entity Annotation)览表Annotation 描述类对象声明,表示一个POJO为一个Nutz.Dao可接受的对象,可以 T对应数据表或者视图 Table(表或者视图名)如果不声明值,那ae么Nutz.Dao将把该对象的getClass().getSimpleName().toLowerCase()作为数据表的名称声明一个实体

2、的时候,有些时候你需要将它存在某一个Table中,但是你却希望从一个 View中获取。 这么做通常是希望View可以帮 你做一些数据的统计方面的工作。Nutz.Dao支持你为一个实体声View 明一个Table的同时也声明一个View,对于一个对象,Nutz.Dao的“增,删,改”操作将针对Table,而“查”操作将针对 View。实际上,如果你没有声明 View,那么你声明的Table将 作为View的默认设置。字段声明,表示当前字段可以被映射到数据库中,Colum n(字段C l 名)可以指定到特定的数据库字段,如果不指定,那么将采用 oumn field.getName()作为名字,大小

3、写是否敏感将依各个不同的数据库 来定。字段声明,告诉Nutz.Dao本字段将作为一个ID来使用。默认的, Nutz.Dao将在每次向数据库中插入一个对象后,更新一下Id字段Id的值,因为它认为ld字段是默认自动增长的。如果想消除这个特性,由你自己来控制ld字段的值,请这样 ld(ldType.STATIC)来 声明你的ID字段字段声明,告诉Nutz.Dao本字段将作为一个Name来使用。一个实 体的Nam一般在数据表中都会做了唯一性约束。所以当你依靠Nam来获取一个对象的时候,相当于Name曲代码1. SELECT * FROM table WHERE name=.;NotNull字段声明,如

4、果你试图Nutz.Dao插入或者更新一个对象,给该字 段赋 null 值将导致一个 com.zzh.dao.FailToMakeSQLException 字段声明,告诉 Nutz.Dao 本字段默认的值。 Default( 你的默认 值) 这个默认值你可以写成动态的,比如Default Default( $name) 当你插入的对象包括一个 name 属 性,这个属性值会替换 $name 否则会用 ( 空串 ) 来替换 $nameReadonly 声明成 Readonly 的字段在插入和更新时将被忽略 在一个字段上声明一条一对一映射, 这个声明需要你输入两个参数 :1. target:你的这个

5、字段对应的实体类。通常,这个类得是你的字段的一个子类或者实现类。或者它能够顺利的通过One Nutz.castor 转换成你的字段。 ( 在 Nutz.Lang Book 里,我 们将详细讨论 Nutz 为你提供的这个崭新的转换框架。在 Nutz.Dao 中,这个框架几乎对你是透明的,只有极特殊的时 候有可能你需要关心它 )2. field:参考字段名,这个字段必须存在当前对象上。声明一条多对多映射,这个声明需要你输入三个参数,其中一个是 可选的:1. target :对应的实体类名,意义和 0n样2. field :参考字段名,同One不同,这个参考字段是target 类中的字段。3. ke

6、y: 当你的字段类型是个 Map 的时候,这个参数就有作用了。因为Ma ny通常会被你加在一个数组字段,或者一个 Collection字段上,当你打算将Many加在一个Map字段上, Nutz.Dao 通过这个参数就可以知道,你的 Map 打算用 目标对象的哪一个属性作为 key ,从而正确为你的建立 Map。注意,Many是一个略微让人疑惑的名称,你可能会想,你声明 Ma ny的字段必须是一个容器或者数组,其实,它也可以是一个单 个对象。对于Nutz.Dao来说,Man字段确切的意义是说:参考字段(Many.field) 是存放在target 对象里的,而One则表示参考 字段是存放在当前对

7、象的。所以Many的确切意思是说“ Can be Many,因此你甚至可以这么写Many(target=A.class,field=id)private A a;那么你通过dao.fetchMany() 将只返回一个结果。M M多对多的关联是数据库非常常见的一种设计,两个数据表通过第三any any张数据表进行关联,同one和Many样,Nutz.dao提供了一个ManyMany勺声明,需要你输入五个参数,其中一个也是可选的:1. target :对应的实体类名,意义和 One和Many样2. relation : 你中间的关联表的名称,这个关联表也可以动态 的,详细请参看后面的动态表名这一节

8、。3. from: 表示关联表中哪个字段代表主对象4. to: 表示关联表中哪个字段代表 target 对象5. key:同Many的参数意义一样。这里需要说明的是, 两个对象的关联是通过 Id 或者 Name 来关联 的,关联的优先级为:1. Id Id2. Id Name3. Name Id4. Name Name就是说,如果主对象有 Id 优先通过 Id 来代表主对象,那么关 联表代表主对象的字段必须为整数。Type虽然 Nutz.Dao 通过 Java 的反射,在绝大多数情况下能知道怎么处 理你的对象,但是对于某些类型,比如枚举类型,它就不知道怎么 处理了,在数据库中到底保存成数字还是

9、保存成字符串 呢? Nutz.Dao 在设计被要求自己不能通过访问数据表来获取如何操作 数据库的知识, 这个要求有助于将来进一步为其设计一些帮助工具, 而且在绝大多数情况下,它也不需要去访 问数据库。所以这里不得 不增加一个新的声明,Type就是用来明确指定一个字段在数据库 里需要保存成什么类型的。不过,在Nutz.Dao的第一版,Type只 会对枚举类型发生作用,如果你不声明Type那么你的枚举字段是按照字符的形式存放在数据库中的,但是你可以用 TypeT(ypes.INT) 来告诉 Nutz.Dao 你要把这个枚举字段按照数字 的方式存放在数据库中, 值则是枚举值的 ordinal()JP

10、A & Hibernate 注解转自:1、En tity( name二E ntityName)必须,name为可选,对应数据库中一的个表2、Table(name=,catalog=,schema=)可选,通常和 Entity配合使用,只能标注在实体的class 定义处,表示实体对应的数据库表的信息name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不 一致的情况下才需要指定表名catalog:可选,表示 Catalog 名称,默认为 Catalog).schema: 可选,表示 Schema名称,默认为 Schema().3、id必须id定义了映射到数据库表的主键的属性,一个实体只

11、能有一个属性被映射为主键.置于getXxxx() 前.4、GeneratedValue(strategy=GenerationType,generator=)可选strategy:表示主键生成策略,有 AUTO,INDENTITY,SEQUENCE 和TABLE 4种,分别表示让ORM框架自动选择,根据数据库的Identity字段生成,根据数据库表的Sequenee字段生 成,以有根据一个额外的表生成主键,默认为AUTO generator: 表示主键生成器的名称 , 这个属性通常和 ORM 框架相关 , 例 如 ,Hibernate 可以指定 uuid 等主键生成方式 .示例 :IdGene

12、ratedValues(strategy=StrategyType.SEQUENCE)public int getPk() return pk;5 、 Basic(fetch=FetchType,optional=true)可选Basic 表示一个简单的属性到数据库表的字段的映射 , 对于没有任何标注 的 getXxxx() 方法 , 默认即为 Basicfetch: 表示该属性的读取策略 , 有 EAGER 和 LAZY 两种 , 分别表示主 支抓取和延迟加载 , 默认为 EAGER.optional: 表示该属性是否允许为 null, 默认为 true示例 :Basic(optional=

13、false)public String getAddress() return address;6 、 Column可选Column 描述了数据库表中该字段的详细定义 , 这对于根据 JPA 注解生成 数据库表结构的工具非常有作用 .name: 表示数据库表中该字段的名称 , 默认情形属性名称一致nullable: 表示该字段是否允许为 null, 默认为 true unique: 表示该字段是否是唯一标识 , 默认为 falselength: 表示该字段的大小 , 仅对 String 类型的字段有效insertable: 表示在 ORM 框架执行插入操作时 , 该字段是否应出现 INSETR

14、T 语句中 , 默认为 trueupdateable: 表示在 ORM 框架执行更新操作时 , 该字段是否应该出现在 UPDATE 语句中 , 默认为 true. 对于一经创建就不可以更改的字段 , 该属 性非常有用 , 如对于 birthday 字段 .columnDefinition: 表示该字段在数据库中的实际类型 . 通常 ORM 框架 可以根据属性类型自动判断数据库中字段的类型 , 但是对于 Date 类型仍无 法确定数据库中字段类型究竟是 DATE,TIME 还是 TIMESTAMP. 此 外 ,String 的默认映射类型为 VARCHAR, 如果要将 String 类型映射到特

15、 定数据库的 BLOB 或 TEXT 字段类型 , 该属性非常有用 .示例 :Column(name=BIRTH,nullable=false,columnDefinition=DATE)public String getBithday() return birthday;7 、 Transient可选Transient 表示该属性并非一个到数据库表的字段的映射 ,ORM 框架将忽 略该属性 .如果一个属性并非数据库表的字段映射 , 就务必将其标示为 Transient , 否则 ,ORM 框架默认其注解为 Basic 示例 :/根据 birth 计算出 age 属性Transientpubl

16、ic int getAge() return getYear(new Date() - getYear(birth);8 、 ManyToOne(fetch=FetchType,cascade=CascadeType ) 可选ManyToOne 表示一个多对一的映射 , 该注解标注的属性通常是数据库表的 外键optional: 是否允许该字段为 null, 该属性应该根据数据库表的外键约束 来确定 , 默认为 truefetch: 表示抓取策略 , 默认为 FetchType.EAGERcascade: 表示默认的级联操作策略 , 可以指定为ALL,PERSIST,MERGE,REFRESH

17、和REMOVE中的若干组合,默认为无级 联操作targetEntity:表示该属性关联的实体类型 . 该属性通常不必指定 ,ORM框架根据属性类型自动判断 targetEntity.示例 :/ 订单 Order 和用户 User 是一个 ManyToOne 的关系/ 在 Order 类中定义ManyToOne()JoinColumn(name=USER)public User getUser() return user;9 、 JoinColumn 可选JoinColumn 和 Column 类似 , 介量描述的不是一个简单字段 , 而是一 个关联字段 , 例如 . 描述一个 ManyToOn

18、e 的字段 .name:该字段的名称.由于JoinColumn 描述的是一个关联字段,如Many ToO ne,则默认的名称由其关联的实体决定例如,实体Order 有一个user 属性来关联实体 User, 则Order 的user属性为一个外键,其默认的名称为实体 User的名称+下划线+实体User的主键名称示例:见 ManyToOne10、 OneToMany(fetch=FetchType,cascade=CascadeType)可选OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库 中并没有实际字段.fetch:表示抓取策略,默认为FetchType.LAZY,因

19、为关联的多个对象通常不必从数据库预先读取到内存cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除例如:实体User和Order 是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除 示例:On eTyMa ny(cascade=ALL) public List getOrders() return orders;例子假设Person和Book是一对多的关系,其中Person的成员变量为:private Integerpersonld ;private String n amep

20、rivate Short age;private List bookList =new ArrayList();对应在 MySql中表的结构为:Person(personld,name,age),不必有bookList 一项,在getBookList 上方通过注释:0neToMaimappedBy-person ,cascade=CascadeType. ALL) OrderBy(value= bookld ASC)与Book关系形成一对多的关系。Book的成员变量是:private int bookld ;private String title ;private double price

21、;private Pers on pers on ;对应在 MySql 中表的结构为:Book(bookld,title,price,personld),注意要有 Person 表的主键personld,这样在插入记录时才不会产生异常。在getPerson上方有注释:ManyToOr(eascade=CascadeType. REFRESoptional= true )JoinColumn(name=person Id)与0n eToMan形成呼应。11 、0n eTo On e(fetch=FetchType,cascade=CascadeType)可选0neToOne描述一个一对一的关联f

22、etch:表示抓取策略,默认为FetchType.LAZYcascade:表示级联操作策略示例:0n eToO ne(fetch-FetchType.LAZY)public Blog getBlog() return blog;12、ManyToMany可选Ma ny ToMa ny描述一个多对多的关联.多对多关联上是两个一对多关联但是在 ManyToMany描述中,中间表是由 ORM框架自动处理如 :package.Book.classmappedBy: 表示多对多关联的另一个实体类的对应集合属性名称示例 :User 实体表示用户 ,Book 实体表示书籍 , 为了描述用户收藏的书籍 可以在

23、 User 和 Book 之间建立 ManyToMany 关联Entitypublic class User private List books;ManyToMany(targetEntity=package.Book.class)public List getBooks() return books;public void setBooks(List books) this.books=books;Entitypublic class Book private List users;ManyToMany(targetEntity=package.Users.class, mappedBy=

24、books)public List getUsers() return users;public void setUsers(List users) this.users=users;两个实体间相互关联的属性必须标记为 ManyToMany, 并相互指定 targetEntity 属性 ,需要注意的是 , 有且只有一个实体的 ManyToMany 注解需要指定 mappedBy 属性13、TransactionAttribute事务管理服务最有用的容器服务可能就是事务管理服务,当应用出现失败或异常时,它保 证了数据库的完整性。你可以简单地将为一个POJO方法申明它的事务属性。这样容器就可以在合

25、适的上下文中运行这个方法。最常见的事务是定义 在session bea n的方法上,方法中所有的数据库操作只有在方法正常退出 时才会提交,如果方法抛出未捕获的异常,事务管理将回滚所有的变更。Tran sactio nAttribute注释用作定义一个需要事务的方法。例如:Tran sactio nAttribute(Tra nsactio nAttributeType.REQUIRED)public void in sertProduct(Stri ng n ame, Float price, boolea n error)它可以有以下参数:a. REQUIRED方法在一个事务中执行,如果调用

26、的方法已经 在一个事务中,则使用该事务,否则将创建一个新的事务。b. MANDATORY方法必须在一个事务中执行,也就是说调用的 方法必须已经有一个事务,否则新抛出一个错误(ERROR)。c. REQUIRESNEW厅法将在一个新的事务中执行, 如果调用的 方法已经在一个事务中,则暂停旧的事务。d. SUPPORTS如果方法在一个事务中被调用,则使用该事务, 否则不使用事务。e. NOT_SUPPORTEDto果方法在一个事务中被调用,将抛出一个错误(ERROR)如果没有指定参数,TransactionAttribute注释使用REQUIRED作为默认参数。14、ersistenceConte

27、xtTypePersiste nceCo ntextType.EXTENDED。在默认情况下, EntityManagers 用 TRANSACTIO的 PersistenceContextType 来创建。 这样做也就表示,只有当有活动的事务处理在进行时,实体才是可托管 的。事务处理一结束,实体就与实体管理程序脱离,这样我们就可以丢 弃它。EXTENDE上下文类型表示这种脱离不会发生,即使在事务处理结 束后实体仍然是可托管的。这就意味着你不需要担心集合是否被暂缓取 回,因为实体管理程序可以用来完成所需要的取回操作。当我们想要保 持和更新合并实体,或者从数据库里删除实体的时候,我们仍然需要 获得 EntityTransaction ,例如我们想要保存一个新的 Application 实 体:public void saveApplication(Application a) EntityTransaction tx=em.getTransaction(); tx.begin();em.persist(a);mit();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1