hibernate注解

来源:互联网 发布:电脑软件出现乱码 编辑:程序博客网 时间:2024/06/06 14:55
@Entity@Table(name = "tbl_answer")public class Answer extends CommonBean{    @Column(name = "answer")    private String answer;    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY,optional="false")    @JoinColumn(name = "questionID")    private Question question;}
@Repositorypublic abstract class CommonDao<T extends CommonBean> implements ICommonDao<T> {    @Autowired    protected SessionFactory sessionFactory;}

@Entity 注解将一个类声明为实体Bean

@Id 注解声明了该实体Bean的标识属性

@Table 为实体Bean指定对应数据库表,目录和schema的名字。包含一个schema和一个catelog属性,使用@UniqueConstraints 可以定义表的唯一约束。

@Table(name="tbl_sky",  uniqueConstraints ={@UniqueConstraint(columnNames={"month", "day"})})

@Column 注解将属性映射到列。

@Column(   name="columnName"; (1) 列名   unique=default false; (2)    是否在该列上设置唯一约束   nullable=default true; (3)   列可空?   insertable=default true; (4) 该列是否作为生成 insert语句的一个列   updatable=default true; (5)  该列是否作为生成 update语句的一个列   columnDefinition=default""; (6)  默认值   table=default "";(7)             定义对应的表(deault 是主表)   length=default 255; (8)              列长度   precision=default 0; // decimalprecision (9)  decimal精度   scale=default 0; // decimal scale        (10) decimal长度)

@ManyToOne注解中CascadeType用法:
cascade(级联)
级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新。若对触发器来修改或删除关联表相记录,必须要删除对应的关联表信息,否则,会存有脏数据。所以,适当的做法是,删除主表的同时,关联表的信息也要同时删除,在hibernate中,只需设置cascade属性值即可。
CascadeType.PERSIST:级联新增(又称级联保存):对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法
例子:只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)
CascadeType.MERGE:级联合并(级联更新):若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法

例子:指A类新增或者变化,会级联B对象(新增或者变化)
CascadeType.REMOVE:级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法

例子:REMOVE只有A类删除时,会级联删除B类;
CascadeType.REFRESH:级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据 (用的比较少)

CascadeType.ALL:以上四种都是

综上所述:一般的,用CascadeType.MERGE:级联合并(级联更新)就能达到级更新同时又稳定不报错。

通过fetch属性指定加载方式,有两个值:
FetchType.LAZY:延迟加载
FetchType.EAGER:急加载,在加载一个实体的时候,其中定义是急加载的的属性(property)和字段(field)会立即从数据库中加载

optional属性是规定一个数据能否为空

@OneToOne,@OneToMany,@ManyToMany
mappedBy:
1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
2>mappedBy标签一定是定义在被拥有方的,他指向拥有方;
3>mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的;
4>mappedBy跟joinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。

@JoinColumn注解与@ManyToOne注解结合使用,来指定保存实体具体关系的配置,指定数据库表中的保存的关联字段,它要标注在实体属性上。

@Transient注解指明被标注的变量不需要被映射到数据库表中

0 0
原创粉丝点击