hibernate積累知識點(diǎn)_第1頁
hibernate積累知識點(diǎn)_第2頁
hibernate積累知識點(diǎn)_第3頁
hibernate積累知識點(diǎn)_第4頁
hibernate積累知識點(diǎn)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1. 設(shè)置外鍵group:id,namestudent:id,name,g_id想讓哪方有外鍵就把JoinColum(name="外鍵名稱/即:主表id")注解在哪方(即:從表中) private Student 引用名;/省略get,set方法在getter方法上面進(jìn)行注解manytoone joinColumn(name="")2.設(shè)置級聯(lián)屬性在擁有外鍵的表(即student實(shí)體中)對應(yīng)的實(shí)體的一端書寫cascade=CascadeType.ALL屬性,然后進(jìn)行session.seve(student)時,就可以進(jìn)行級聯(lián),而不必須去關(guān)心另一個實(shí)體的c

2、ascade=CascadeType.ALL屬性3一對多:只有一對多是把joincolumn寫在多的一方,其他一對一或者多對多可以隨便寫3.多對多:1.cascade=CascadeType.ALL級聯(lián)屬性和joincolumn要寫在同一個類中,但是不能寫joincolumn,不能寫joincolumn,只能寫jointableEg:JoinTable(name="t_s",joinColumns=JoinColumn(name="s_id"),inverseJoinColumns=JoinColumn(name="t_id")15:

3、24 2012/3/135.目前,持久化規(guī)范要求多的一方為關(guān)系維護(hù)端,一的一方為關(guān)系被維護(hù)端,可以再one方的onetomany注釋設(shè)置mappedBy屬性,以指定它是這一關(guān)聯(lián)關(guān)系的被維護(hù)端,many方為關(guān)系維護(hù)端。mappedBy的功能為:不用再在這方再重新建立連接,一切遵從另一方,這樣可避免冗余 關(guān)于mappedBy的含義:1.只有onetoone,onetomany,manytomany上才有mappedBy屬性,manytoone不存在該屬性。2.mappedBy標(biāo)簽一定是定義在the owned side(mappedBy為被擁有方。被擁有方的),他指向the owning side

4、(擁有方)。3.mappedBy的含義,應(yīng)該理解為,擁有方能夠自動維護(hù)跟被擁有方的關(guān)系當(dāng)然,如果從被擁有方,通過手工強(qiáng)行來維護(hù)擁有方的關(guān)系也是可以做到的4.mappedBy跟joincolumn、jointable總是處于互斥的一方,可以理解為正是由于擁有方的關(guān)聯(lián)被擁有方的字段存在,擁有方才擁有了被擁有方。mappedBy這方定義的joincolumn/jointable總是失效的,不會建立對應(yīng)的字段或表。 6.1.擁有外鍵的是主表,主表里面有一個字段指向從表里面的主鍵,所以刪除時只能刪除主表(student),才能刪除從表(group),不然從表不能刪除。,指定外鍵的名稱,則系統(tǒng)自動進(jìn)行處理

5、: 在主表(owner table)中將創(chuàng)建聯(lián)接列, 列名為:主體的關(guān)聯(lián)屬性名下劃線被關(guān)聯(lián)端的主鍵列名.9.mappedBy的功能為:不用再在這方再重新建立連接,一切遵從另一方,這樣可避免冗余(1).設(shè)置外鍵想讓哪方有外鍵就把JoinColum(name="外鍵名稱/即:主表id")注解在哪方(即:從表中) private 主表類名 引用名;/省略get,set方法在get方法上面進(jìn)行注解manytoone joinColumn(2).設(shè)置級聯(lián)操作方級聯(lián)來保存多方數(shù)據(jù),你想通過哪方來保存數(shù)據(jù),則在哪方處理關(guān)聯(lián)關(guān)系,并設(shè)置cascadeType=CascadeType.ALL

6、 和 fetch=FetchType.Lazy(3)JoinColum cascadeType=CascadeType.ALL 和 fetch=FetchType.Lazy 三者在一起 ->>有外鍵,從表mappedBy(name="") ->>主表mappedBy(name="") 與 JoinColum 不能放在一起,即:分別放在有關(guān)系的兩個實(shí)體中(4)/* 級聯(lián)保存* 想通過哪方來級聯(lián)保存數(shù)據(jù),則在哪方設(shè)置關(guān)聯(lián)關(guān)系,并設(shè)置級聯(lián)* 在student類中處理關(guān)聯(lián)關(guān)系,并設(shè)置cascade=CascadeType.ALL*/Tes

7、tpublic void testSave() Session se = HibernateUtil.getSession();Transaction tx = se.beginTransaction();Teacher t = (Teacher) se.get(Teacher.class, 3);Student s = (Student) se.get(Student.class, 2);s.getTs().add(t);try se.save(s);mit(); catch (Exception ex) tx.rollback();ex.printStackTrace();/*往數(shù)據(jù)庫中填

8、數(shù)據(jù)*/Test public void save() Session se = HibernateUtil.getSession(); Transaction tx = se.beginTransaction(); Teacher t1 = new Teacher(); t1.setName("1234"); Teacher t2 = new Teacher(); t2.setName("2345"); Student s = new Student("s1"); s.getTs().add(t1); s.getTs().add(t

9、2); try se.save(s); mit(); catch (Exception ex) tx.rollback(); ex.printStackTrace(); /* * 級聯(lián)保存 * * 想通過哪方來級聯(lián)保存數(shù)據(jù),則在哪方設(shè)置關(guān)聯(lián)關(guān)系,并設(shè)置級聯(lián) * * 在teacher類中處理關(guān)聯(lián)關(guān)系,并設(shè)置cascade=CascadeType.ALL */ public void testSaveOther() Session se = HibernateUtil.getSession(); Transaction tx = se.beginTransaction(); Set<Stud

10、ent> ss = new HashSet<Student>(); ss.add(new Student("s0"); ss.add(new Student("s2"); ss.add(new Student("s3"); Teacher t3 = new Teacher("t1"); t3.setSs(ss); try se.save(t3); mit(); catch (Exception ex) tx.rollback();10.session緩存(一級緩存)Hibernate的緩存包括se

11、ssion緩存和sessionFactory緩存,其中sessionFactory緩存又可以分為兩類,內(nèi)置緩存和外置緩存。Session的緩存是內(nèi)置的,不能被卸載,也被稱為hibernate的第一級緩存。sessionFactory的外置緩存也被稱為hibernate的第二級緩存。當(dāng)hibernate根據(jù)id訪問數(shù)據(jù)對象的時候,首先從session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查,查不到,再查詢數(shù)據(jù)庫,把結(jié)果按照id放入緩存。1)它是輕量級的類在Hibernate中,實(shí)例化的Session是一個輕量級的類,創(chuàng)建和銷毀它都不會占用很多資源。 這在實(shí)際項(xiàng)目中確實(shí)很重要,

12、因?yàn)樵诳蛻舫绦蛑?,可能會不斷地?chuàng)建以及銷毀Session對象,如果Session的開銷太大,會給系統(tǒng)帶來不良影響。(2)但它是非線程安全的值得注意的是Session對象是非線程安全的,因此最好是一個線程只創(chuàng)建一個Session對象(將它設(shè)計(jì)為局部對象)。(3)public static final ThreadLocal threadLocal=new ThreadLocal();pulic static Session currentSession()Session currentSession=(Session)threadLocal.get();if(currentSession=nul

13、l)currentSession=sessionFactory.openSession();threadLocal.set(currentSession);return currentSession;(4)第二緩存為數(shù)據(jù)庫(5)一級緩存session,二級緩存db查詢數(shù)據(jù)時,系統(tǒng)會自動先查找第一緩存即session,如果找到,則直接返回,不會經(jīng)過數(shù)據(jù)庫,如果沒有,則再去數(shù)據(jù)庫中查找.(6)配置配置文件hibernate-cfg.xml(a)使用注解方式,則使用來AnnotationConfiguration創(chuàng)建連接,則使用Configuration.配置實(shí)體類的配置文件<mapping

14、resource="com/model/student.xml"/>(7)getCurrentSession()獲得正在運(yùn)行的session使用getCurrentSession()時,要在配置文件hibernate-cfg.xml中進(jìn)行配置,<property name="current-session-context_class">thread</property>(8)session緩存openSession()為打開一個session緩存,所以各不相同SessionFactory sf=new AnnotationC

15、onfiguration().configuration().bulitSessionFactory(); Session s1=sf.openSession();Session s2=sf.openSession();getCurrentSession()獲得目前正在運(yùn)行的session,都一樣,但是如果關(guān)閉之后再打開,則不同11.比較實(shí)體(1)比較兩個實(shí)體的不同User u1=s1.get(User.class,1);User u2=s1.get(User.class,1);User u3=s2.get(User.class,1);(2) User u1=s1.get(User.class

16、,new Long(1);User u2=s1.get(User.class,new Long(1);User u3=s2.get(User.class,new Long(1);(3)User u1=new User();User u2=new User();12.編程規(guī)范package com.test;public class HibernateTest private static SessionFactory sf;BeforeClasspublic static void beforeClass() sf = HibernateUtil.sf;Testpublic void test

17、Save() Session s = Hibernate.getSession();Transaction tx = s.beginTransaction();User u1 = new User();u1.setName("u1");User u2 = new User();u2.setName("u2");try s.save(u1);s.save(u2);mit(); catch (Exception ex) tx.rollback();ex.printStackTrace();AfterClasspublic static void afterC

18、lass() if (sf != null)sf.close();13.懶加載與即時加載(1)多對多懶加載發(fā)出的SQL語句:Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_ from t_student student0_ where student0_.id=?學(xué)生s1的老師有:Hibernate: select ts0_.s_id as s1_1_, ts0_.t_id as t2_1_, teacher1_.id as id1_0_, teacher1_.name as name1_0_ from t

19、_s ts0_left outer join t_teacher teacher1_ on ts0_.t_id=teacher1_.id where ts0_.s_id=?12342345即時加載發(fā)出的SQL語句:Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_ from t_student student0_ where student0_.id=?學(xué)生s1的老師有:Hibernate: select ts0_.s_id as s1_1_, ts0_.t_id as t2_1_, teacher1_.id

20、 as id1_0_, teacher1_.name as name1_0_ from t_s ts0_left outer join t_teacher teacher1_ on ts0_.t_id=teacher1_.id where ts0_.s_id=?12342345(2)load 容易引發(fā)的no session異常,即:超出session范圍解決之道:?在session范圍內(nèi)使用?openSssionInview?Hibernate.initialize(對象的引用/user)例如:User user=new User();(3)遍歷Set集合Teacher t=(Teacher)

21、session.get(Teacher.class,1);for(Student s: t.getStudents)(4)遍歷List集合Groupp group =(Groupp)session.get(Groupp.class,1);for(int i=0;i<group.getUser().size();i+)(5)Map遍歷首先,private Map<Integer,User> user=new HashMap<Integer,User>(); 在getter屬性上面書寫Mapkey(name="id")遍歷:Testpublic v

22、oid testMap()Session session = sf.getCurrentSession();Transaction tx = session.beginTransaction();Groupp group=(Groupp)session.get(Groupp.class, 1);for(Map.Entry<Integer, Student> map:group.getStudents().entrySet() mit();(8)不級聯(lián)刪除Student s=(Student)session.get(Student.class,1);s.setTeacher(null

23、);session.delete(s);13.一對多Customer類package com.model;EntityTable (name="t_customer")public class Customer private Integer id;private String name;private Set<Orders> os=new HashSet<Orders>();public Customer()public Customer(String name) =name;public Customer(String name

24、,Set<Orders> os) =name;this.os=os;OneToMany(mappedBy="cut",cascade=CascadeType.ALL) public Set<Orders> getOs() return os;public void setOs(Set<Orders> os) this.os = os;IdGeneratedValuepublic Integer getId() return id;public void setId(Integer id) this.id = id;pub

25、lic String getName() return name;public void setName(String name) = name;Orders類package com.model;EntityTable (name="t_orders")public class Orders private Integer id;private String name;private Customer cut;public Orders()public Orders(String name)this .name =name;public Orders(S

26、tring name,Customer cus) this .name =name;this .cut=cus;ManyToOneJoinColumn(name="c_id")public Customer getCut() return cut;public void setCut(Customer cut) this.cut = cut;IdGeneratedValuepublic Integer getId() return id;public void setId(Integer id) this.id = id;public String getName() re

27、turn name;public void setName(String name) = name;Hibernate類package com.test;public class HibernateTest private static SessionFactory sf; BeforeClass public static void beforeClass() sf=new AnnotationConfiguration().configure().buildSessionFactory(); Test public void table_create() new Sch

28、emaExport(new AnnotationConfiguration().configure().create(false, true); Test public void testSave() /在Orders類中設(shè)置級聯(lián)保存 Session se=sf.openSession(); Transaction tx=se.beginTransaction(); Set<Orders> os=new HashSet<Orders>(); os.add(new Orders("衣服"); os.add(new Orders("玩具&quo

29、t;); os.add(new Orders("書"); Customer cus=new Customer("雪兒",os); se.save(cus); mit(); se.close(); Test public void testSaveOther() /在Customer類中設(shè)置級聯(lián)保存 Session se=sf.openSession(); Transaction tx=se.beginTransaction(); Customer cut=new Customer("雪兒"); new Orders("衣服&

30、quot;,cut); new Orders("玩具",cut); new Orders("書",cut); se.save(cut); mit(); se.close(); AfterClass public static void afterClass()if(sf!=null)sf.close();14.多對多1).多對多多對多會生成多張表,其中有一張關(guān)聯(lián)表,字段為:每張表的id本表private Set<另一張表的名稱> 引用名=new HashSet<另一張表的名稱>();/省略get,set屬性ManyToMany(c

31、ascadeType=CascadeType.ALL,fetch=FetchType. LAZY)JoinTable(name="關(guān)聯(lián)表名稱",joinColumn=JoinColumn(name="本表id"),inverseJoinColumn=JoinColumn(name="另一張表的id")另一張表ManyToMany(mappedBy="引用名")mappedBy的功能為:不用再在這方再從新建立連接,一切遵從那方,這樣可避免冗余因?yàn)槭莾蓮埍碇g是多對多的關(guān)系,所以會生成三張表,兩張表是由實(shí)體類映射數(shù)據(jù)庫

32、而來,都沒有外鍵,其中一張為關(guān)聯(lián)表,只包含兩張表各自的主鍵,用以維持兩表間的關(guān)聯(lián).Student類package com.model;EntityTable(name = "t_student")public class Student private Integer id;private String name;private Set<Teacher> ts=new HashSet<Teacher>();public Student() public Student(String name) = name;IdGenerated

33、Valuepublic Integer getId() return id;ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)JoinTable(name = "t_s", joinColumns = JoinColumn(name inverseJoinColumns = JoinColumn(name ="t_id") )public Set<Teacher> getTs() return ts;public void setTs(Set<Teacher> ts)

34、this.ts = ts;public void setId(Integer id) this.id = id;public String getName() return name;public void setName(String name) = name; = "s_id") ,Teacher類package com.model;EntityTable (name="t_teacher")public class Teacher private Integer id;private String name;private Se

35、t<Student> ss=new HashSet<Student>();public Teacher()public Teacher(String name) =name;IdGeneratedValuepublic Integer getId() return id;ManyToMany(mappedBy="ts")public Set<Student> getSs() return ss;public void setSs(Set<Student> ss) this.ss = ss;public voi

36、d setId(Integer id) this.id = id;public String getName() return name;public void setName(String name) = name;HibernateTest類package com.test;public class HibernateTest private static SessionFactory sf;BeforeClass public static void beforeClass() sf = HibernateUtil.sf; /* * 創(chuàng)建新表 */ Test publ

37、ic void table_create() new SchemaExport(new AnnotationConfiguration().configure().create( false, true); /* * 級聯(lián)保存 * * 想通過哪方來級聯(lián)保存數(shù)據(jù),則在哪方設(shè)置關(guān)聯(lián)關(guān)系,并設(shè)置級聯(lián) * * 在student類中處理關(guān)聯(lián)關(guān)系,并設(shè)置cascade=CascadeType.ALL */ Test public void testSave() Session se = HibernateUtil.getSession(); Transaction tx = se.beginTransac

38、tion(); Teacher t = (Teacher) se.get(Teacher.class, 3); Student s = (Student) se.get(Student.class, 2); s.getTs().add(t); try se.save(s); mit(); catch (Exception ex) tx.rollback(); ex.printStackTrace(); /* *往數(shù)據(jù)庫中填數(shù)據(jù) */Test public void save() Session se = HibernateUtil.getSession(); Transaction tx =

39、se.beginTransaction(); Teacher t1 = new Teacher(); t1.setName("1234"); Teacher t2 = new Teacher(); t2.setName("2345"); Student s = new Student("s1"); s.getTs().add(t1); s.getTs().add(t2); try se.save(s); mit(); catch (Exception ex) tx.rollback(); ex.printStackTrace(); /

40、* * 級聯(lián)保存 * * 想通過哪方來級聯(lián)保存數(shù)據(jù),則在哪方設(shè)置關(guān)聯(lián)關(guān)系,并設(shè)置級聯(lián) * * 在teacher類中處理關(guān)聯(lián)關(guān)系,并設(shè)置cascade=CascadeType.ALL */ public void testSaveOther() Session se = HibernateUtil.getSession(); Transaction tx = se.beginTransaction(); Set<Student> ss = new HashSet<Student>(); ss.add(new Student("s0"); ss.add(

41、new Student("s2"); ss.add(new Student("s3"); Teacher t3 = new Teacher("t1"); t3.setSs(ss); try se.save(t3); mit(); catch (Exception ex) tx.rollback();ex.printStackTrace(); finally AfterClasspublic static void afterClass() if (sf != null)sf.close();15. 動態(tài)更新:xml:dynamic-u

42、pdate=true 只更新有變動的字段,默認(rèn)值為false注解:Column(name="t_age",updatable=false) 此字段不更新,默認(rèn)值為true16 .session與getcurrentSession:1.同一個session中,查找同一個對象發(fā)出一條select語句,查找不同的對象,假如查詢倆個對象則發(fā)出兩條select語句,發(fā)出不同的select語句。2.不同的session范圍,查找相同的對象,發(fā)出不同的select語句,查找不同的對象,肯定也是發(fā)出不同的select語句.3.打開一個session(先openSession()后getCu

43、rrentSession()或者均是getCurrentSession()),并且處于同一個事務(wù),則發(fā)出一條select語句4.如果都重新創(chuàng)建session,并且是同一個事務(wù),也會發(fā)出兩條select語句.5.處于兩個不同事務(wù)的查找對象,都會打印不同的select語句.17.配置二級緩存的實(shí)現(xiàn):1.實(shí)體中類名上面書寫:Cache(usage = CacheConcurrencyStrategy.READ_WRITE)3.總配置文件中添加部分配置:<property name="cache.use_second_level_cache">true</prop

44、erty>4.測試:使用.setCacheable(true)18. 1.使用createQuery:創(chuàng)建泛型集合保存對象,集合中的每個對象是數(shù)據(jù)庫中的一行記錄。Query query=session.createQuery("from Org");List<Org> list=query.list();for(int i=0;i<list.size();i+)2.使用createSQLQuery提取所有數(shù)據(jù):如果查詢所有數(shù)據(jù),創(chuàng)建list泛型集合,使用.addEntity(Course.class)進(jìn)行轉(zhuǎn)化為對象,便于遍歷。Query query=session.createSQLQuery("select * from t_course").addEntity(Course.class); List<Course> list=query.list();for(int i=0;i<list.size();i+)如果查詢部分?jǐn)?shù)據(jù),創(chuàng)建集合和對象數(shù)組進(jìn)行遍歷取值Query query=session.createSQLQuery("select o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論