`
friendsys
  • 浏览: 347468 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Hibernate Annotation 初记

阅读更多
在spring中需要进行特别的声明配置Annotation风格的SessionFactory.具体见SimpleSSHF的ApplicationContext.xml

@Entity将一个Javabean类声明为一个实体的数据库表映射类...也可以成为持久化POJO类,最好实现序列化

@Id注释为主键类的定义,定义在对应属性的get方法之上

@Table是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名
       其中uniqueConstraints能够结合@uniqueConstraint 进行列的唯一约束,多个

@Version 用于在实体类中添加对乐观锁的支持,定义在getVesion方法之上

@Basic  实体Bean中所有的非Static 非transient的属性都可以被持久化,没有定义注解属性的等价于在其上添加了@Basic注解
通过@Basic注解可以声明属性的获取策略(lazy与否),默认的是即时获取(early fetch),这里又讨论到了
延迟关联获取和延迟属性获取,通常不需要对简单属性设置延迟获取,如需要定义@Basic(fetch=FetchType.LAZY)

@Temporal 定义时间的精度(DATE,TIME,TIMESTAMP),例如@Temporal(TemporalType.DATE)

@Lob 持久化为Blob或者Clob类型,根据get方法的不同,自动进行Clob和Blob的转换,其中String为Blob,byte[]为Clob

@Cloum 将属性映射到列,就是把数据库列的约束带到JavaBean中.
       updatable=false:不可更新,属性值是不可变的;
       name="xx":映射的列名;
       nullable=false;不能为空;
       length=50:列的长度
        ...共10个属性

@Embeddable
@AttributeOverride 提供嵌入式对象的复写,即实体类中的其他实体类对象

@GeneratedValue 标识符(主键)的生成策略,配合@Id使用

使用SEQ_STORE配置的sequence生成器
@Id @GeneratedValue(strategy=GrnerationType.SEQUENCE,generator="SEQ_STORE")

使用identity生成器
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)

其他情况下还包括了Auto,用于可移植的应用
多个id可以共享一个identifier生成器,使用@SequenceGenerator和@TableGenerator,可以配置
不同的identifier生成器,生成器的适用范围,可以是应用级和类一级.其中类一级可以覆盖应用级.

应用级生成器定义在包一级,单独的java文件中
@javax.persistence.TableGenerator(...属性键值对)
@javax.persistence.SequenceGenerator(...)

比较常见的应该是类一级的sequence生成器
@Entity
@javax.persistence.SequenceGenerator{
name="SEQ_STORE",
sequenceName="my_seqence"}
然后在@GeneratedValue中的generator="SEQ_STORE"

定义组合主键的方法:有三种

1:将组件类朱杰伟@Embeddable,并将组件的属性注解为@Id
2:将组件的属性注解为@EmbeddedId
3:将类注解为@IdClass,并将该实体类中的所有属于主键的属性都注解为@Id

下面介绍@IdClass的用法
其中@Id都是定义在get方法之上,@IdClass(对应单独的主键类名字.class)
在本类中使用@Id定义需要建立联合主键的类,在主键类中只要定义对应的属性,以及get和set方法,并且使用相同的名字进行定义
这个是符合Ejb3标准

也可以使用Hibernate专门的方式.
定义原类级别的
@Entity
@AssociationOverride(name="id.channel",joinColumns=@JoinColumn(name="chan_id"))
@EmbededId public TvMa id....这个为主键类对象

主键类中
@Embeddable

@ManyToOne
public Chanel chanel
public String name;
@ManyToOne
public Presesenter presenter;

映射实体Bean的关联关系

一对一:就是主外键表中都只能存在唯一
分为三种情况. 1:共享一个主键
      2:通过外键关联到另一个实体的主键.(必须在外键列增加唯一约束)
      3:通过关联表来保存两个实体之间的链接关系(必须在外键列增加唯一约束)

一对一共享主键:使用@PrimaryKeyJoinColumn定义一对一关联,保证两个实体类的主键id相同,然后在一个类中
定义另外个类的get方法,并且设置@OneToOne(CasadeType.ALL)

二:使用外键列进行实体的关联
在主键类表中定义外键表的实体类get方法
然后设置
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="password_fk") ""中为主键列中外键列名
...外键表实体类的get方法

外键表实体类中
@OneToOne(mappedBy="passport")""中为主键表实体类中的属性名(主体的关联属性)
public ...主键表实体类get方法
其中@JoinColumn是可选的

多对一(Many-to-one)
使用@ManyToOne注解定义多对一
@ManyToOne(cascade=(CascadeType.PERSIST,CascadeType.MERGE),targetEntity=CompanyImpl.class)
@JoinColumn(name="COMP_ID")
...对应get方法..
其中@JoinColumn也是可选的
targetentity属性用于在接口作为返回值的时候,一般不需要设置

多对多的没有专门描述,应该放在了两个的关联表中进行了描述

集合类型的使用
使用OnetoMany 或者ManyToOne进行对应的设置,可以映射成对应的List集合,也可以使用泛型进行约束
@Entity
public class City{--------一方
@OneToMany(mappedBy="city")--外键实体类中的属性名
@OrderBy("streetName")-----外键实体类中的属性名
public List<Street> getStreets()....
}
在对应的Street类中-------多方
@ManyToOne
public City getCity()
{....}

关键是主要放定义List保存多方引用,使用OneToMany注解,其中可以使用@Order(外键表属性)
外表部分就是使用@ManyToOne 放置在主表实体类的get方法之上

一对多关系就是多对一. 因为是双向关联的
建立双向的关键,在多对一一方几乎总是双向关联中主体端,而一对多这端的关联注解为
@OneToMany(mappedBy=...) ...为外键表中的主表对象的属性名,这样外键表不必也不能再定义物理映射了

映射EJBQL/HQL查询(就是将HQL写在单独的类里面,然后进行直接的调用)
使用@NamedQuery和@NameQueries在类和包上的注释,在Session factory/Entity Manager factory范围中都可见

直接定义在包级别,不需要有class
@NamedQueries{
@javax.persistence.NamedQuery(name="plane.getall",query="select p from Plane p")
}

定义在类级别
@NameQuery(name="night.moreRecentThan",query="select n from Night n where n.data>=:data")
public class Night{...}

调用的方式
public class MyDao{
doStuff()
{
Query q = s.getNamedQuery("night.moreRecentThan");
q.setDate("date",值)
List result=q.list();
}
}



映射本地化的查询(就是使用普通SQL查询)

需要使用@SqlResultSetMapping注解描述resultset的结构,这样会进行结果集自动映射成对应的实体类


hibernate自带的Annotation,对Ejb的拓展

@Generated : 用于设置在插入和更新后的自动查询.

@OnDelete(action=OnDeleteAction.CASCADE):用于在删除时候,触发级联删除

延迟选项和获取模式,EJB3提供了Fetch选项,Hibernate提供了更丰富的选项集

@LazyToOne:定义了@ManyToOne和OneToOne关联的延迟选项

@LazyCollection:定义个@ManyToMany和@OneToMany关联的延迟选项,其中lazyCollectionOption 为true表示具有延迟性
Extra:集合具有延迟性,false用于关闭延迟加载

@Fetch: 定义了加载关联关系的获取策略.设置FethMode属性,SUBSELECT为子查询模式,JOIN会取消所有的延迟加载

关于集合类型的注解
@BatchSizebatch设置集合的batch大小

@Where注解设置Where子句

@Check来设置check子句

@OrderBy来设置SQL的Order by子句

@OnDelete(action=OnDeleteAction.CASCADE) 注解设置级联删除策略

@Sort(type=SortType.COMPARATOR,comparator=TicketComparator.class) 其中comparator用于比较器

更多的集合类型

@OneToMany(cascade=CascadeType.ALL);
@IndexColumn(name="表名",base=1);
public list<xx>...{};

如果忘记设置@IndexColumn,那会使用bag的形式返回数据,即允许重复元素的无需集合


缓存的使用,激活Hibernate的二级缓存
使用@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
usage: 给定缓存的并发策略
region:(可选的) 缓存范围
include(可选的) 值为all包括了所有属性,默认为all  non-lazy为非延迟属性

Hibernate内置了数据验证

直接将注释定义在实体类的对应方法上
比如
@NotNull  @Length(max=20),可以选择定义在get方法上,或者对应的字段field之上

使用的时候可以在一层进行设置,然后使用到各个层次中 需要下载单独的jar包,是一个单独的框架
验证的方法
ClassValidator personValidator = new ClassValidator(Person.class)
ClassValidator addressValidator = new ClassValidator(Address.class,ResourceBundle.getBundle("messages",Locale.ENGLISH))
第一行依赖嵌入Hibernate验证器内的错误信息
第二行为这些信息准备资源包

InvalidValue[] validationMessages = addressValidtor.getInvalidValues(address)
进行验证,返回错误信息

也可以对一个属性进行验证
ClassValidator addressValidator = new ClassValidator(Address.class,ResourceBundle.getBundle("messages",Locale.ENGLISH)
InvalidValue[] validationMessagees = addressValidator.getInvalidValues(address,"city")
InvalidValue[] validationMessagees = addressValidator.getPotentialInvalidValues("city","Paris")


与Lucene集成
....资料太少,用到时候再补充




资料摘自:满江红版hibernate annotation文档,可从官方网站下载



分享到:
评论

相关推荐

    Hibernate Annotation jar

    这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...

    hibernate annotation中文文档

    hibernate annotation中文文档

    hibernate annotation hibernate3

    《Hibernate注解与Hibernate3深度解析》 在Java开发领域,Hibernate作为一种强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本篇将深入探讨Hibernate 3版本中的注解使用,帮助开发者理解如何利用注解进行...

    hibernate annotation 中文文档

    《Hibernate Annotation 中文文档》是Java开发者们的重要参考资料,它详细介绍了如何在Hibernate框架中使用注解进行对象关系映射(ORM)。Hibernate是一款强大的开源Java持久化框架,它简化了数据库与Java对象之间的...

    最全的Hibernate Annotation API文档

    在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...

    Hibernate Annotation 中文文档

    **Hibernate Annotation 中文文档** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它极大地简化了数据库操作。随着技术的发展,Hibernate Annotation逐渐成为主流,因为它提供了更直观、更简洁的方式来...

    Hibernate Annotation库

    Hibernate Annotation库是Java开发中用于简化对象关系映射(ORM)的一个重要组件,它使得开发者能够在Java类上直接使用注解来定义数据库映射,从而避免了传统的XML配置文件。这三个特定的jar包是Hibernate ORM框架中...

    Hibernate Annotation 学习笔记

    《Hibernate Annotation 学习笔记》 在Java的持久化框架中,Hibernate以其强大的功能和易用性成为开发者首选之一。而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML...

    Hibernate Annotation入门

    **Hibernate Annotation 入门** Hibernate 是一款非常流行的Java对象关系映射(ORM)框架,它允许开发者使用面向对象的方式操作数据库。而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上...

    Hibernate Annotation

    Hibernate Annotation

    hibernate 注解 annotation 教程

    hibernate 注解 annotation 教程

    Hibernate_annotation3.4_api.CHM

    Hibernate annotation 3.4 api CHM

    sping hibernate Annotation(注释配置) demo(例子)

    总结来说,这个 "Spring Hibernate Annotation demo" 展示了如何在 Spring 框架中使用注解配置来管理依赖,以及如何利用 Hibernate 的注解进行数据持久化。同时,它还涉及到了 Flex 前端与后端的交互。通过学习这个 ...

    hibernate annotation api chm文件

    Hibernate Annotation API是Hibernate ORM的一种扩展,允许开发者使用Java注解(Annotations)来定义对象-关系映射。这种API避免了传统的Hibernate XML配置文件,使得ORM配置更加内聚且易于维护。 2. **核心注解**...

    HibernateAnnotation

    ### HibernateAnnotation 技术概述 在Java开发领域中,Hibernate框架是进行对象关系映射(Object-Relational Mapping,简称ORM)的一种非常流行的工具。它能够帮助开发者将面向对象的模型与关系型数据库进行桥接,...

    Hibernate Annotation 笔记 总结 注解

    【标题】:深入理解Hibernate Annotation及其使用 【描述】:本文将全面介绍Hibernate Annotation的使用,包括事务管理和声明式事务处理,以及如何通过注解简化数据库持久化操作。 【标签】:Hibernate, ...

    Hibernate-Annotation中文教程.pdf

    Hibernate Annotation中文教程 Hibernate 是 Java 数据库持久性的事实标准之一,它非常强大、灵活,而且具备了优异的性能。传统上,Hibernate 的配置依赖于外部 XML 文件,而最近发布的几个 Hibernate 版本中,...

    Hibernate Annotation 唯一外键一对一双向关联

    通过阅读《Hibernate_annotation_1to1_foreignKey》文档或博客,你可以更详细地了解如何配置和使用这种关联,包括示例代码、注意事项以及可能遇到的问题和解决方案。理解并熟练运用这些知识,能帮助你在使用...

Global site tag (gtag.js) - Google Analytics