Hibernate Annotation

来源:互联网 发布:软件工作室注册 编辑:程序博客网 时间:2024/05/16 07:58

在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")

原创粉丝点击