@Transient
可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架默认其注解为@Basic
(即:当将一个属性设置@Transient注解时,表结构中并没有显示此属性)
关系映射注解
- 一对一单向外键
- 一对一双向外键关联
- 一对一双向外键联合主键
- 多对一单向外键关联
- 一对多单向外键关联
- 一对多双向外键关联
- 多对多单向外键关联
多对多双向外键关联
一对一单向外键关联
用到注解:@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name=”“,unique=true)
详情
这2个注解写到主类中,cascade表示级联关系,CascadeType.ALL表示全级联关系,包括级联删除,级联添加,级联更新等 ;JoinColumn表示将被控类的主键键写到主控类中充当外键,unique表示唯一,应该先保存外键对象,再保存主键对象
注意:注解要么全部写在字段上,要不全部写在getXX()方法上,千万不能混合使用否则会报如下错误 org.hibernate.MappingException: Could not determine type for: com.txr.oto.fk.IdCard, at table: Student
org.hibernate.AnnotationException: No identifier specified for entity 后来分析错误原因是因为在对VipOperatorDto进行对象关系映射的时候忘记加上主键@Id了。这个错是hibernate的annotation报的错,所以肯定是对象上加的注解有问题
注意 主键类和外键类都要session.save; 先保存外键类
一对一双向外键
- 主控方的配置同一对一单向外键关联
- 但是被控方要标注 @OneToOne(mappedBy=”card”)
- 双向关联,必须设置mappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双方都无法保存。
- 详情
一对一双向外键联合主键
- 要借助主键类来实现,所以要创建主键类,主键类必须要实现serializable接口,重写hashCode()和equals()方法
- 主键类要写@Embeddable
- 实体类的联合主键属性上添加@EmbeddedId
多对一单向外键
- 在多数方添加@ManyToOne(cascade={CascadeType.All},fetch=FetchType.EAGER)
@JoinColumn(name=”“,referencedColumnName=”“)
fetch抓取策略,FetchType.EAGER表示积极的
JoinColumn(多方持有一方的引用,一方的外键用name表示,referencedColumnName表示外键映射到表里的字段)
详情
两个类都要加载,否则会出现错误,类如org.hibernate.exception.constraintviolationexception: could not execute statementat