如何使用hibernate注解

注意:
1、使用注解之后要修改hibernate.cfg.xml中的mapping为
<mapping class="com.ma.entity.Dept"/>
2、大多数情况下导javax.persistence包下的注解,当需要使用hibernate特殊功能时需要导入hibernate包
3、尽量写双向关联,并且保证多的一方维护1的一方


@Entity:标识实体类为持久化类,写到类名上面
@Table:设置实体类和数据库关联的表名,写到类名上面,支持自动匹配,但是要求类名和表名一致
name:对应数据库中的表名        
    例如:@Table(name="`DEPT`")
    
--------------------以下所有注解都写到属性上-------------------------
@Id:标识实体类中对应表的主键属性。


@GeneratedValue:定义标识属性值的生成策略(某个属性的值如何增长由它定义)
generator:表示主键生成器的名称
strategy:主键生成策略
    例如:@GeneratedValue(generator="xl",strategy=GenerationType.SEQUENCE)


@SequenceGenerator:定义序列生成器
allocationSize: 每次主键值增加的大小
initialValue:表示主键初始值,默认为0
name:表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中
sequenceName:表示生成策略用到的数据库序列名称。
   例如:@SequenceGenerator(allocationSize=0,initialValue=1,name="xl",sequenceName="tes_seq")


    完整主键设置示例:
    @Id
@Column(name="`EMPNO`")
private Integer empno; 


@Column:将属性映射到列(表中的字段)
name:表示数据库表中该字段的名称,默认情形属性名称一致 
nullable - 可选,表示该字段是否允许为 null,默认为 true
unique - 可选,表示该字段是否是唯一标识,默认为 false
length - 可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255.
insertable - 可选,表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为 true
updateable - 可选,表示在ORM 框架执行更新操作时,该字段是否应该出现在UPDATE 语句中,默认为 true. 
对于一经创建就不可以更改的字段,该属性非常有用,如对于 birthday字段。
columnDefinition - 可选,表示该字段在数据库中的实际类型。通常ORM 框架可以根据属性类型自动判断数据库中字段的类型,
但是对于Date 类型仍无法确定数据库中字段类型究竟是 DATE,TIME 还是TIMESTAMP. 
此外 ,String 的默认映射类型为 VARCHAR, 如果要将 String 类型映射到特定数据库的 BLOB或 TEXT 字段类型,该属性非常有用。 
  例如:@Column(name="`DEPTNO`")


@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient


---------------------------关联映射注解-------------------------
单向@OneToOne:一对一关联映射
@JoinColumn:(外键表对应实体类属性名)
例如:
@OneToOne
@JoinColumn(name="deptno")
private Dept dept;




单向@OneToMany:一对多关联映射
@JoinColumn:指定修饰的集合和当前类关联的外键属性(外键表对应实体类属性名)
   例如:
    @OneToMany
@JoinColumn(name="deptno")
private Set<Emp> empSet = new HashSet<Emp>();


双向@OneToMany:一对多关联映射
注意:@JoinColumn和@JoinTable以及mappedBy他们是互斥的,一边有了join另一边只能写mappedBy
1 的一方代码如下:Student
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "student")
private Set<Result> results = new HashSet<Result>(0);
其中:
cascade :级联
fetch:是否延迟加载
mappedBy:间接指定外键关系
多的一方代码如下:Result
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "StudentNo", nullable = false)
private Student student;




单向@ManyToOne:多对一关联映射
@JoinColumn:(外键表对应实体类属性名)
   例如
@ManyToOne
@JoinColumn(name="deptno")
private Dept dept;




双向@ManyToOne:多对一关联映射---和双向@OneToMany一样




双向@ManyToMany多对多关联映射需要涉及到三张表
注意:如果想显示中间表的数据建议拆成多对一
A主体端            B关联端            C中间表
Student           Subject              Result


1、在主体端写如下代码
@ManyToMany(fetch = FetchType.EAGER)
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinTable(name = "Result", 
joinColumns = {@JoinColumn(name = "StudentNo") },
inverseJoinColumns = { @JoinColumn(name = "SubjectId") })
private Set<Subject> setSubjects = new HashSet<Subject>();
其中:
@ManyToMany: 多对多关联映射
fetch:指定加载方式(FetchType.EAGER:立即加载   FetchType.LAZY:延迟加载) 
@Cascade:级联操作
@JoinTable:描述关联表和关联条件
name:中间表表名
joinColumns:写的都是本表在中间表的外键名称,
  inverseJoinColumns:写的是另一个表在中间表的外键名称。


2、在关联端写如下代码
@ManyToMany(mappedBy = "setSubjects",fetch=FetchType.LAZY)
private Set<Student> setStudents = new HashSet<Student>();
其中:
@ManyToMany: 多对多关联映射
mappedBy:该参数包含了主体端的属性名,这样就绑定双方的关系
fetch:指定加载方式(FetchType.EAGER:立即加载   FetchType.LAZY:延迟加载) 

























  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值