hibernate注解.docx
- 文档编号:7423956
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:50
- 大小:28.74KB
hibernate注解.docx
《hibernate注解.docx》由会员分享,可在线阅读,更多相关《hibernate注解.docx(50页珍藏版)》请在冰豆网上搜索。
hibernate注解
HibernateAnnotation
使用hibernateAnnotation来映射实体
准备工作
下载
hibernate-distribution-3.3.2.GA
hibernate-annotations-3.4.0.GA
slf4j
导入相关依赖包
HibernateHOME:
\hibernate3.jar
\lib\bytecode(二进制)
\lib\optional(可选的)
\lib\required(必须的)
导入required下的所有jar包
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate3.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
slf4j-api-1.5.10.jar
slf4j-log4j12-1.5.10.jar
log4j-1.2.14.jar
mysql.jar
---Annotation包
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
简单的例子,通过annotation注解来映射实体PO
1、建立(JavaProject)项目:
hibernate_0100_annotation_HelloWorld_default
2、在项目根下建立lib目录
a)导入相关依赖jar包
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate3.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
log4j-1.2.14.jar
mysql.jar
slf4j-api-1.5.10.jar
slf4j-log4j12-1.5.10.jar
3、建立PO持久化类cn.serup.model.Teacher内容如下
packagecn.serup.model;
importjavax.persistence.Entity;
importjavax.persistence.Id;
//@Entity表示该是实体类
@Entity
publicclassTeacher{
privateintid;
privateStringusername;
privateStringpassword;
//ID为主键,主键手动分配
@Id
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
4、在src目录中建立hibernate.cfg.xml(hibernate配置文件)文件,内容如下
DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"
mysql:
//localhost/hibernate
--独立线程运行,如果通过getCurrentSession()来获得Session,需要设置如下-->
--映射持久化类-->
5.、建立新的源码包test
a)编写单元测试,结构如下cn.serup.hibernate.test.TeacherTest内容如下:
packagecn.serup.hibernate.test;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.AnnotationConfiguration;
importorg.hibernate.tool.hbm2ddl.SchemaExport;
importorg.junit.AfterClass;
importorg.junit.BeforeClass;
importorg.junit.Test;
importcn.serup.model.Teacher;
publicclassTeacherTest{
privatestaticSessionFactorysessionFactory;
@Test
publicvoidtestSaveTeacher(){
Teachert=newTeacher();
t.setId
(2);
t.setUsername("努尔哈赤");
t.setPassword("12345");
Sessionsession=sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(t);
session.beginTransaction().commit();
}
@BeforeClass
publicstaticvoidbeforeClass(){
newSchemaExport(newAnnotationConfiguration().configure()).create(true,true);
sessionFactory=newAnnotationConfiguration().configure().buildSessionFactory();
}
@AfterClass
publicstaticvoidafterClass(){
sessionFactory.close();
}
}
Annotation表名称与字段映射,长度
1、项目:
hibernate_0200_annotation_column
2、表名称映射,在默认情况下使用@Entity,则使用类名做为表名
3、所有的注解写在get()方法上面
4、表名映射
a)@Table(name="t_teacher")
3、字段映射
a)默认情况下,则使用属性名称来作为列名(字段名)
b)在get()方法上写注解
i.@Column(name="t_username")
ii.长度
iii.@Column(name="t_username",length=35)
c)默认情况下会将所有的属性映射到表中,如果不想某个属性映射到表中,如下编写
i.@Transient(瞬时、临时(或者透明))
Annotation映射主键属性(ID生成策略)
1、项目:
hibernate_0300_annotation_ID
2、使用@Id注解可以将实体bean中的某个属性定义为标识符(identifier),该属性的值可以通过应用自身进行设置(ID手动分配,但不能重复)
3、(EJB3规范)也可以通过Hiberante生成(推荐).使用@GeneratedValue注解可以定义该标识符的生成策略:
∙AUTO-可以是identitycolumn类型,或者sequence类型或者table类型,取决于不同的底层数据库.
∙TABLE-使用表保存id值
∙IDENTITY-identitycolumn
∙SEQUENCE-sequence
AUTO相当于XML映射文件中的Native
4、AUTO,写上@GeneratedValue则会默认选择AUTO来生成主键,会根据你的方言来选择数据库提供的自增机制,作为主键的生产策略,如果数据库是MySQL,则使用auto_increment
@Id
@GeneratedValue
//或者@GeneratedValue(strategy=GenerationType.AUTO)
publicintgetId(){....}
5、IDENTITY取得最大的ID值+1,作为主键
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
publicintgetId(){....}
6、TABLE使用hilo(高低位算法,来产生主键)
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
publicintgetId(){....}
7、SEQUENCEOracle的自增机制
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
publicintgetId(){....}
使用Oracle的SEQUENCE的话。
他会自动建一张SEQUENCE表,默认表名hibernate_sequence
如果想改SEQUENCE表名的话。
如下编写
@SequenceGenerator(name="aa",sequenceName="teacherSEQ_DB")
publicclassTeacher{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="aa")
publicintgetId(){...}
}
说明:
@SequenceGenerator(name="aa",sequenceName="teacherSEQ_DB")
Name为引用名称sequenceName为表名称
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="aa")
使用类SEQUENCE为主键生成策略,更改表名,使用generator="aa"引用类上定义好的aa
Annotation关系映射
1、一对一外键关联映射(单向)
2、一对一外键关联映射(双向)
3、一对一主键关联映射(不重要)在这不演示
在实际中很少用,使用注解@PrimaryKeyJoinColumn
意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用
注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML
映射可以生成。
Annotation注解一对一主键关联映,有些bug。
不过没空去研究它。
因为在实际开发中一对一很少用。
在实际开发中我机会没有用过,主键关联就更少了
4、多对一关联映射
5、一对多关联映射(单向)
6、一对多关联映射(双向)
7、多对多关联映射(单向)
8、多对多关联映射(双向)
一对一外键关联映射(单向)
1、项目:
hibernate_0400_annotation_one2one_fk_1
2、建立PO
a)cn.serup.model.Body
b)cn.serup.model.Heart
packagecn.serup.model;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
importjavax.persistence.JoinColumn;
importjavax.persistence.OneToOne;
@Entity
publicclassBody{
privateintid;
privateStringbodyName;
privateHeartheart;
publicStringgetBodyName(){
returnbodyName;
}
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="bodyid",unique=true)
//一对一外键关联,使用@OneToOne,并设置了级联操作
//@JoinColum设置了外键的名称为bodyid如果不设置,则默认为heart_id
//外键的值是唯一的(unique),不可重复,与Heart的主键一直
publicHeartgetHeart(){
returnheart;
}
@Id
@GeneratedValue
publicintgetId(){
returnid;
}
publicvoidsetBodyName(StringbodyName){
this.bodyName=bodyName;
}
publicvoidsetHeart(Heartheart){
this.heart=heart;
}
publicvoidsetId(intid){
this.id=id;
}
}
packagecn.serup.model;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
@Entity
publicclassHeart{
privateintid;
privateStringheartName;
@Id
@GeneratedValue
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetHeartName(){
returnheartName;
}
publicvoidsetHeartName(StringheartName){
this.heartName=heartName;
}
}
编写单元测试cn.serup.hibernate.test.One2One_1
packagecn.serup.hibernate.test;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.AnnotationConfiguration;
importorg.hibernate.tool.hbm2ddl.SchemaExport;
importorg.junit.AfterClass;
importorg.junit.BeforeClass;
importorg.junit.Test;
importcn.serup.model.Body;
importcn.serup.model.Heart;
publicclassOne2One_1{
privatestaticSessionFactorysessionFactory;
@Test
publicvoidtestSaveTeacher(){
Hearth=newHeart();
h.setHeartName("h2");
Bodyb=newBody();
b.setBodyName("b2");
b.setHeart(h);
Sessionsession=sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(h);
session.save(b);
session.beginTransaction().commit();
}
@Test
publicvoidtestLoadOne2One(){
Sessionsession=sessionFactory.getCurrentSession();
session.beginTransaction();
Bodyb=(Body)session.get(Body.class,1);
System.out.println(b.getId()+""+b.getBodyName());
Hearth=b.getHeart();
System.out.println(h.getId()+""+h.getHeartName());
session.beginTransaction().commit();
}
@Test
publicvoidtestDeleteOne2One(){
Sessionsession=sessionFactory.getCurrentSession();
session.beginTransaction();
Bodyb=(Body)session.get(Body.class,1);
session.delete(b);
session.beginTransaction().commit();
}
@BeforeClass
publicstaticvoidbeforeClass(){
newSchemaExport(newAnnotationConfiguration().configure())
.create(true,true);
sessionFactory=newAnnotationConfiguration().configure()
.buildSessionFactory();
}
@AfterClass
publicstaticvoidafterClass(){
sessionFactory.close();
}
}
一对一双向关联关系:
hibernate_0500_annotation_one2one_fk_2
改动Heart对象
packagecn.serup.model;
importjavax.persistence.CascadeType;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
importjavax.persistence.OneToOne;
@Entity
publicclassHeart{
privateintid;
privateStringheartName;
privateBodybody;
@OneToOne(mappedBy="heart",cascade=CascadeType.ALL)
//一对一双向关联关系,使用@OneToOne
//注意:
需要加上mappedBy="heart",如果不加上的话,
//Heart也会生成一个外键(body_id)
//mapped="heart"需要指向与他关联对象的一个属性
//说明双向关联关系中,有且仅有一端是作为主体(owner)端存在的
//主体端负责维护联接列
//对于不需要维护这种关系的从表则通过mappedBy属性进行声明
//mappedBy的值指向主体的关联属性
//规律:
只有是双向关联关系,都加上mapped
//cascade=CascadeType.ALL级联
publicBodygetBody(){
returnbody;
}
publicvoidsetBody(Bodybody){
this.body=body;
}
@Id
@GeneratedValue
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetHeartName(){
returnheartN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 注解
![提示](https://static.bdocx.com/images/bang_tan.gif)