在hibernate中我们使用注解,可以帮助我们简化hbm文件配置。
1.1. PO类注解配置
@Entity 声明一个实体br/>@Table来描述类与表对应
Hibernate注解开发
br/>@Id来声明一个主键
@GenerateValue 用它来声明一个主键生成策略
Hibernate注解开发
默认情况下相当于native
可以选择的主键生成策略 AUTO IDENTITY SEQUENCE
br/>@Column来定义列
Hibernate注解开发
br/>注意:对于PO类中所有属性,如果你不写注解,默认情况下也会在表中生成对应的列。
列的名称就是属性的名称
@Temporal来声明日期类型
Hibernate注解开发
可以选择
TemporalType.DATA 只有年月日
TemporalType.TIME 只有小时分钟秒
TemporalType.TIMESTAMP 有年月日小时分钟秒
我们最终需要在hibernate.cfg.xml文件中将我们类中的注解配置引用生效
Hibernate注解开发
问题:1.如果我们主键生成策略想使用UUID类型?
Hibernate注解开发
问题2:如果设定类的属性不在表中映射?
Hibernate注解开发
对于我们以上讲解的关于属性配置的注解,我们也可以在其对应的getXxx方法去使用
1.2. 一对多(多对一)
br/>@OneToMany
@ManyToOne
br/>以Customer与Order为例
Customer类
![](https://s1.51cto.com/images/blog/201909/11/b59a68c8de4de8cb8710f8269171bd84.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
Order类
![](https://s1.51cto.com/images/blog/201909/11/c5e6062cff84a5b012ed687fc7c7f37e.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
示例:保存客户时,保存订单
对于这个示例我们需要在Customer中配置cascade操作,save-update
第一种方式,可以使用JPA提供的注解
![](https://s1.51cto.com/images/blog/201909/11/ec7c490819f1ee0b05d9254677234e89.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
第二种方式:可以使用hibernate提供的注解
![](https://s1.51cto.com/images/blog/201909/11/638c1b9b568f73e22601a1b5e2979f29.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
以下是示例代码
![](https://s1.51cto.com/images/blog/201909/11/4cf89861366a5b5a9ee9859dee141c9b.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
执行后的结果
![](https://s1.51cto.com/images/blog/201909/11/8f9a8a86cf9f384d2e108664334db959.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
订单中没有关联客户的id,为什么?
原因:我们在Customer中配置了mappedBy=”c”它代表的是外键的维护由Order方来维护,而Customer不维护,这时你在保存客户时,级联保存订单,是可以的,但是不能维护外键,所以,我们必须在代码中添加订单与客户关系。
![](https://s1.51cto.com/images/blog/201909/11/2139a0ee801f1251a2641e276cf3bd81.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
扩展:关于hibernate注解@Cascade中的DELETE_ORPHAN过时
Hibernate注解开发
使用下面方案来替换过时方案
Hibernate注解开发