版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、3. :在 SessionFactory 创立时,自动检查数据库结构,或者将数据库 schema 的 DDL 导出到数据库。使用 create-drop 时,在显式关闭 SessionFactory 时,将删除掉数据库 schema。 例如:validate | update | create | create-dropcreate :如果没有表就创立update :如果表结构更新,就更新validate :每次插入表的时候看看表结构有没有更新。理论上是先建类后建表:这个时候只要你的类建好了,可以跨数据库。实际中先建表比先建类多,建好表以后要对数据库进行优化,比方建索引,建试图,各种各样的优化
2、。 projectetc目录下面有很多例如性的文档,log4j的文档就在那个下面。SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();SessionFactory的建立是很消耗时间的,应该像连接池一样,只建立一次,以后要用就直接从那用。Hibernate文档建议我们自己写一个辅助类,用单例来做。JUnit的一个bug:BeforeClasspublic static void beforeClass() sessionFactory = new Annot
3、ationConfiguration().configure().buildSessionFactory();在这句话的时候配置文件如果有的时候写错了,她悄悄把错误隐藏起来了。解决的方法:可以对这句话加try catch块8.表名和类名不一致的时候:EntityTable(name="_teacher")public class Teacher 10字段名和属性名不一致的时候Column(name="_name")public String getName() return name;11 不需要的字段的设置Transientpublic String
4、getYourWifeName() return yourWifeName;12 映射指定的时间日期Temporal(TemporalType.TIME)public Date getBirthDate() return birthDate;在注解里面如果一个注解的属性名字叫value,你可以不写,直接写后面的值,如Temporal(value=“TemporalType.TIME)可写成上面的那样。如果不写会把时间日期都放到表里面指定时间时默认TemporalType.TIMESTAMP还有 time 和date 不过最常用的还是默认的。13注意映射枚举类型用habernate xml的方式
5、很麻烦在设定枚举时 :以字符串方式显示:EnumType.STRING 以数字书序显示:EnumType.ORDINALEnumerated(EnumType.STRING)public Gender getGender() return gender;自增 Mysql autoincreatment Oracle sequence 如果将来的程序想跨数据库平台选native或uuidGenerateValue注意是里的value,默认的是nativeincrement(很少用)用于为 long, short 或者 int 类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。
6、在集群下不要使用。identity用得较多对 DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 的内置标识字段提供支持。返回的标识符是 long,short 或者 int 类型的。sequence用得较多在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列sequence, 而在 Interbase 中使用生成器generator。返回的标识符是 long,short 或者 int 类型的。hilo使用一个高/低位算法高效的生成 long,short 或者 int 类型的标识符。给定一个表和字段默认分别是 hibern
7、ate_unique_key 和 next_hi作为高位值的来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。uuid用一个 128-bit 的 UUID 算法生成字符串类型的标识符,这在一个网络中是唯一的使用了 IP 地址。UUID 被编码为一个 32 位 16 进制数字的字符串。guid在 MS SQL Server 和 MySQL 中使用数据库生成的 GUID 字符串。Native用得较多根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。在Oracle里面表名不能以下划线开头 IdGeneratedValue 默认的是auto相当于nat
8、ive,在jpa1.0中,只有四种ID生成策略,下面的b、c、d、e这种方式虽然是跨平台的,但是由于各种数据库生成数据的方式不同,生成的数据会有所不同。如果要在跨平台的数据库中生成的方式也相同,可以采用e。但极少会出现跨数据库平台的情况。用auto的方式在Oracle中sequence生成策略只能起名hibernate sequence,不能起别的名字。跨数据库平台的情况:自己写了一个给别人用的类库,这个类库可以跨平台。public int getId() return id;IdGeneratedValue(strategy=GenerationType.TABLE, generator=&
9、quot;Teacher_GEN")这里也可指定生成别的方式。GenerationType可以在javaee文档里面找public int getId() return id;在Oracle中生成方式如果是sequence,可以指定一个sequence的名字。SequenceGenerator(name="teacherSEQ", sequenceName="teacherSEQ_DB")public class Teacher IdGeneratedValue(strategy=GenerationType.SEQUENCE, generat
10、or="teacherSEQ")public int getId() return id;6、设计数据库的时候建立主键,能用一个字段就尽量用一个字段,不要用多个字段。但是不可防止,有些数据库表别人已经设计好了,有两个字段作为主键,这时可以在hibernate中使用联合主键。在程序中用到面向对象的思想,要建立一个主键类,并对该类实现serializable接口。实现序列化的原因:出现这种情况:系统实现集群,很多台效劳器对外效劳,一台效劳器当机了,正好有一局部属性在那边;另一种情况:如果内存满了,会用到虚拟内存把硬盘上的一局部空间作为内存,有局部内容就要存到硬盘上去了。重写eq
11、uals和hashcode的原因:主键要保证唯一性,不仅在数据库中要保证,一系列的对象要放在内存中,也要有所区分。所以一定要重写equals和hashcode,而且逻辑不能乱写,不能用父类中的equals和hashcode。要比照是否相同,首先要查hash表的hashcode,再与hashcode相同的比照。public class StudentPK implements java.io.Serializableprivate int id;private String name;public int getId() return id;public void setId(int id) t
12、his.id = id;public String getName() return name;public void setName(String name) = name;Overridepublic boolean equals(Object o) if(o instanceof StudentPK) StudentPK pk = (StudentPK)o;if(this.id = pk.getId() && .equals(pk.getName() return true;return false;Overridepublic in
13、t hashCode() return .hashCode();getCurrentSession 和 openSession 得到的不是同一个类,所以这两种方式不能混用。有两种事物,一种是指针对数据库本身的不能处理分布式的事物.另外一种是JTA事物,能处理分布式的。<property name="current_session_context_class">thread</property>tomcat不能使用这种:因为它没有相关的实现<property name="current_session_context_
14、class">jta</property> public void testClear() Session session = sessionFactory.getCurrentSession();session.beginTransaction();Teacher t = (Teacher)session.load(Teacher.class, 1);System.out.println(t.getName();session.clear();Teacher t2 = (Teacher)session.load(Teacher.class, 1);System.o
15、ut.println(t2.getName();/如果没有clear,数据库里面就只有一条更新语句session.getTransaction() mit();public void testFlush() Session session = sessionFactory.getCurrentSession();session.beginTransaction();Teacher t = (Teacher)session.load(Teacher.class, 1);t.setName("tttt");session.flush();t.setName("tttt
16、t");/如果没有flush,数据库里面就只有一条更新语句,如果用clear,就变成了transitant状态,就不发语句了。session.getTransaction() mit();缓存:本来东西在硬盘上的,现在在内存中开了一块区域,用来方便读取我们想要提高读取效率的引用。onetonoe/仅仅是onetonoe产生的外键名字为Wife_ID,这时需要指定对应表中外键的名字JoinColum(name=WifeID)一对一双向外键关联:单向和双向在数据库里面没有区别,在java程序里面有区别,双向可以通过wife找到husband也可通过husband找到wifeEntityp
17、ublic class Wife private int id;private String name;private Husband husband;OneToOne(mappedBy="wife")/告诉hibernate,在这里不需要创立外键,只需要关联到Husband类里面的wife属性。public Husband getHusband() return husband;public void setHusband(Husband husband) this.husband = husband;IdGeneratedValuepublic int getId()
18、return id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) = name;Entitypublic class Husband private int id;private String name;private Wife wife;IdGeneratedValuepublic int getId() return id;public String getName() return name;OneT
19、oOneJoinColumn(name="wifeId")public Wife getWife() return wife;public void setId(int id) this.id = id;public void setName(String name) = name;public void setWife(Wife wife) this.wife = wife;一对一单向关联,联合主键关联。用得很少这里的joincolumns是想改里面的外键的名字。 Entitypublic class Husband private int id;pr
20、ivate String name;private Wife wife;IdGeneratedValuepublic int getId() return id;public String getName() return name;Embeddedpublic Wife getWife() return wife;public void setId(int id) this.id = id;public void setName(String name) = name;public void setWife(Wife wife) this.wife = wife;publ
21、ic class Wife private String wifeName;/小心与Husband表里面的字段同名,可在get方法上加column在数据库里面改变名字private int age;public int getAge() return age;public void setAge(int age) this.age = age;public String getWifeName() return wifeName;public void setWifeName(String name) this.wifeName = name; 第一范式:要有主键,列不可分。第二范式:联合主键
22、存在的时候不能存在局部依赖。第三范式:不能存在传递依赖。 多对一单向:EntityTable(name="t_user")public class User private int id;private String name;private Group group;ManyToOne/只要写个ManyToOne就行了public Group getGroup() return group;public void setGroup(Group group) this.group = group;IdGeneratedValuepublic int getId() retur
23、n id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) = name;EntityTable(name="t_group")/group是关键字,所以要改名字public class Group private int id;private String name;IdGeneratedValuepublic int getId() return id;public void setId
24、(int id) this.id = id;public String getName() return name;public void setName(String name) = name;一对多单向:EntityTable(name="t_group")public class Group private int id;private String name;private Set<User> users = new HashSet<User>();/用set比拟好,因为不会有重复IdGeneratedValuepubli
25、c int getId() return id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) = name;OneToManyJoinColumn(name="groupId")/如果没有JoinColumn,会当成多对多的情况,产生中间表public Set<User> getUsers() return users;public void setUsers(Set<
26、User> users) this.users = users;EntityTable(name="t_user")public class User private int id;private String name;IdGeneratedValuepublic int getId() return id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) = name; 多对多单向
27、关联:Entitypublic class Teacher private int id;private String name;private Set<Student> students = new HashSet<Student>();IdGeneratedValuepublic int getId() return id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) = nam
28、e;ManyToManyJoinTable(name="t_s",/如果想改变中间表的表名joinColumns=JoinColumn(name="teacher_id"),/如果想改变字段名inverseJoinColumns=JoinColumn(name="student_id")/如果想改变另一张表的字段名)public Set<Student> getStudents() return students;public void setStudents(Set<Student> students) th
29、is.students = students;Entitypublic class Student private int id;private String name;IdGeneratedValuepublic int getId() return id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) = name;多对多双向关联:Entitypublic class Student private in
30、t id;private String name;private Set<Teacher> teachers = new HashSet<Teacher>();ManyToMany(mappedBy="students")/只要在这边加一个mappedBy就行了public Set<Teacher> getTeachers() return teachers;public void setTeachers(Set<Teacher> teachers) this.teachers = teachers;IdGeneratedVa
31、luepublic int getId() return id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) = name;Entitypublic class Teacher private int id;private String name;private Set<Student> students = new HashSet<Student>();IdGeneratedVal
32、uepublic int getId() return id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) = name;ManyToManyJoinTable(name="t_s",joinColumns=JoinColumn(name="teacher_id"),inverseJoinColumns=JoinColumn(name="student_id
33、")public Set<Student> getStudents() return students;public void setStudents(Set<Student> students) this.students = students; 如果只写OrderBy 那么按照主键排序 用in还是exists,用exists 因为它的执行效率高 qbc:query by criterialqbe:query by examplejava语言在语法级别上是没有内存泄漏的,因为他有垃圾回收器帮助回收,但是如果你写程序的时候用到了一些资源,一定要注意回收,比方说
34、你用到了连接池翻开了链接一定要注意关闭,不然他在内存中就老开着。比方说你翻开了文件,一定要注意关闭,不关闭的话他就不会调用本地的资源把它关闭。这个其实是在本地的代码里面有,因为这样相当于java调用了c,c调用了Windows的API。c语言是需要手动调用内存的,所以这其实是java引起的。所以在语法级别上其实没有,但是在你实际中写程序的时候很有可能引起内存泄漏。public void testQBC() Session session = sf.openSession();session.beginTransaction();/criterion 标准/准那么/约束Criteria c =
35、session.createCriteria(Topic.class) /from Topic .add(Restrictions.gt("id", 2) /greater than = id > 2 .add(Restrictions.lt("id", 8) /little than = id < 8 .add(Restrictions.like("title", "t_") .createCriteria("category") .add(Restrictions.between
36、("id", 3, 5) /category.id >= 3 and category.id <=5 ;/DetachedCritereafor(Object o : c.list() Topic t = (Topic)o;System.out.println(t.getId() + "-" + t.getTitle();session.getTransaction() mit();session.close();public void testQBE() Session session = sf.openSession();session.beginTransaction();Topic tExample = new Topic();tExample.setTitle("T_");Example e = Example.create(tExample).ignoreCase().enableLike();Criteria c = session.createCriteria(Topic.class) .add(Restr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 虚拟现实会展用户体验-洞察分析
- 用户行为分析在插件开发中的应用-洞察分析
- 第08讲 科学记数法、近似数(人教版)(解析版)
- 焰火污染物排放预测模型-洞察分析
- 稳定区域划分与优化-洞察分析
- 安全观察培训课件具体内容与模拟案例
- 勤俭节约之星事迹简介(5篇)
- 新型城镇化人口管理-洞察分析
- 药物代谢与靶向治疗-洞察分析
- 网络切片安全威胁预测模型-洞察分析
- 健身指导与管理职业生涯规划书
- 股份有限公司深入推进2023-2025年全面合规风险防控管理体系建设的实施意见
- 以工代赈工作总结范文
- 峨眉山月歌-李白
- 2023-2024学年辽宁省沈阳市铁西区牛津上海版(三起)四年级上册期末学业水平测试英语试卷
- IPv6地址规划策略
- 2022-2023学年湘少版(三起)六年级英语上册期末测试题含答案
- 人教版2023-2024学年五年级数学上册第五单元:列方程解鸡兔同笼问题专项练习(原卷版)+(解析答案)
- 土地利用现状分类-
- xx煤矿闭坑前安全风险专项辨识评估报告
- 合成氨-氮肥-成都玉龙化工实习报告
评论
0/150
提交评论