版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、3. :在 SessionFactory 創(chuàng)立時,自動檢查數(shù)據庫結構,或者將數(shù)據庫 schema 的 DDL 導出到數(shù)據庫。使用 create-drop 時,在顯式關閉 SessionFactory 時,將刪除掉數(shù)據庫 schema。 例如:validate | update | create | create-dropcreate :如果沒有表就創(chuàng)立update :如果表結構更新,就更新validate :每次插入表的時候看看表結構有沒有更新。理論上是先建類后建表:這個時候只要你的類建好了,可以跨數(shù)據庫。實際中先建表比先建類多,建好表以后要對數(shù)據庫進行優(yōu)化,比方建索引,建試圖,各種各樣的優(yōu)化
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 以數(shù)字書序顯示:EnumType.ORDINALEnumerated(EnumType.STRING)public Gender getGender() return gender;自增 Mysql autoincreatment Oracle sequence 如果將來的程序想跨數(shù)據庫平臺選native或uuidGenerateValue注意是里的value,默認的是nativeincrement(很少用)用于為 long, short 或者 int 類型生成 唯一標識。只有在沒有其他進程往同一張表中插入數(shù)據時才能使用。
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作為高位值的來源。高/低位算法生成的標識符只在一個特定的數(shù)據庫中是唯一的。uuid用一個 128-bit 的 UUID 算法生成字符串類型的標識符,這在一個網絡中是唯一的使用了 IP 地址。UUID 被編碼為一個 32 位 16 進制數(shù)字的字符串。guid在 MS SQL Server 和 MySQL 中使用數(shù)據庫生成的 GUID 字符串。Native用得較多根據底層數(shù)據庫的能力選擇 identity、sequence 或者 hilo 中的一個。在Oracle里面表名不能以下劃線開頭 IdGeneratedValue 默認的是auto相當于nat
8、ive,在jpa1.0中,只有四種ID生成策略,下面的b、c、d、e這種方式雖然是跨平臺的,但是由于各種數(shù)據庫生成數(shù)據的方式不同,生成的數(shù)據會有所不同。如果要在跨平臺的數(shù)據庫中生成的方式也相同,可以采用e。但極少會出現(xiàn)跨數(shù)據庫平臺的情況。用auto的方式在Oracle中sequence生成策略只能起名hibernate sequence,不能起別的名字??鐢?shù)據庫平臺的情況:自己寫了一個給別人用的類庫,這個類庫可以跨平臺。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、設計數(shù)據庫的時候建立主鍵,能用一個字段就盡量用一個字段,不要用多個字段。但是不可防止,有些數(shù)據庫表別人已經設計好了,有兩個字段作為主鍵,這時可以在hibernate中使用聯(lián)合主鍵。在程序中用到面向對象的思想,要建立一個主鍵類,并對該類實現(xiàn)serializable接口。實現(xiàn)序列化的原因:出現(xiàn)這種情況:系統(tǒng)實現(xiàn)集群,很多臺效勞器對外效勞,一臺效勞器當機了,正好有一局部屬性在那邊;另一種情況:如果內存滿了,會用到虛擬內存把硬盤上的一局部空間作為內存,有局部內容就要存到硬盤上去了。重寫eq
11、uals和hashcode的原因:主鍵要保證唯一性,不僅在數(shù)據庫中要保證,一系列的對象要放在內存中,也要有所區(qū)分。所以一定要重寫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 得到的不是同一個類,所以這兩種方式不能混用。有兩種事物,一種是指針對數(shù)據庫本身的不能處理分布式的事物.另外一種是JTA事物,能處理分布式的。<property name="current_session_context_class">thread</property>tomcat不能使用這種:因為它沒有相關的實現(xiàn)<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,數(shù)據庫里面就只有一條更新語句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,數(shù)據庫里面就只有一條更新語句,如果用clear,就變成了transitant狀態(tài),就不發(fā)語句了。session.getTransaction() mit();緩存:本來東西在硬盤上的,現(xiàn)在在內存中開了一塊區(qū)域,用來方便讀取我們想要提高讀取效率的引用。onetonoe/僅僅是onetonoe產生的外鍵名字為Wife_ID,這時需要指定對應表中外鍵的名字JoinColum(name=WifeID)一對一雙向外鍵關聯(lián):單向和雙向在數(shù)據庫里面沒有區(qū)別,在java程序里面有區(qū)別,雙向可以通過wife找到husband也可通過husband找到wifeEntityp
17、ublic class Wife private int id;private String name;private Husband husband;OneToOne(mappedBy="wife")/告訴hibernate,在這里不需要創(chuàng)立外鍵,只需要關聯(lián)到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;一對一單向關聯(lián),聯(lián)合主鍵關聯(lián)。用得很少這里的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在數(shù)據庫里面改變名字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; 第一范式:要有主鍵,列不可分。第二范式:聯(lián)合主鍵
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、關聯(lián):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;多對多雙向關聯(lián):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 因為它的執(zhí)行效率高 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東水利電力職業(yè)技術學院《小學班級管理主任工作》2023-2024學年第一學期期末試卷
- 廣東生態(tài)工程職業(yè)學院《媒介批評》2023-2024學年第一學期期末試卷
- 廣東石油化工學院《交互設計概論》2023-2024學年第一學期期末試卷
- 七年級上冊《5.3.2 銷售中的盈虧問題》課件與作業(yè)
- 廣東嶺南職業(yè)技術學院《藝術學原理》2023-2024學年第一學期期末試卷
- 大學生創(chuàng)新創(chuàng)業(yè)降龍十八講(閩南師范大學)學習通測試及答案
- 大學體育(上海體育學院)學習通測試及答案
- 2025新北師大版英語七年級下UNIT 6 Animals單詞表
- 【名師一號】2020-2021學年高中地理中圖版同步練習必修二-雙基限時練8
- 【紅對勾】2021-2022學年人教版高中政治必修一習題-第二單元-生產、勞動與經營-5-1
- 安全工器具-變壓器絕緣油課件
- 瓦楞紙箱工藝流程演示文稿
- 神通數(shù)據庫管理系統(tǒng)v7.0企業(yè)版-3概要設計說明書
- 生產異常問題反饋流程圖
- 安置房項目二次結構磚砌體工程專項施工方案培訓資料
- SB/T 10756-2012泡菜
- GB/T 20492-2006鋅-5%鋁-混合稀土合金鍍層鋼絲、鋼絞線
- 公司變更評審表
- 醫(yī)院輸血質量管理考核標準
- 七年級語文上冊:15、《古代詩歌四首》教案
- 自由戰(zhàn)爭-簡體素材表
評論
0/150
提交評論