@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;
}
@Repository
public 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)
注解中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
注解指明被标注的变量不需要被映射到数据库表中