hibernate一對一共享主鍵映射是如何配置?一對一關係外鍵映射如何配置?
下面做個簡單測試。
導入jar包
配置hibernate.cfg.xml文件
寫相關實體
數據庫建表
映射文件配置
測試
第一個測試是一對一共享主鍵
hibernate.cfg.xml配置
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 添加配置信息:數據庫連接參數 --> <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property> <property name="hibernate.connection.username">zt</property> <property name="hibernate.connection.password">zt</property> <!-- 添加配置信息:hibernate 自身屬性 dialect :方言,指定數據類型,hibernate可以針對不同的數據庫做出相應的優化 --> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!-- 爲getCurrentSession增加配置 --> <property name="current_session_context_class">thread</property> <mapping resource="person.cfg.xml"/> </session-factory> </hibernate-configuration>
2.person 實體,在這裏粗略表達個人
passport實體,粗略表示護照。
person 實體代碼
package com.hibernate.entity; public class Person { private Integer id; private String name; private String address; // 護照信息 private Passport passport; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Passport getPassport() { return passport; } public void setPassport(Passport passport) { this.passport = passport; } public Person(Integer id, String name, String address) { super(); this.id = id; this.name = name; this.address = address; } public Person() { super(); } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", address=" + address + "]"; } }
passport實體代碼
package com.hibernate.entity; public class Passport { private Integer id; private Integer expire; private String note; // 個人信息 private Person person; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getExpire() { return expire; } public void setExpire(Integer expire) { this.expire = expire; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public Passport(Integer id, Integer expire, String note) { super(); this.id = id; this.expire = expire; this.note = note; } public Passport() { super(); } @Override public String toString() { return "Passport [id=" + id + ", expire=" + expire + ", note=" + note + "]"; } }
3.數據庫建表
CREATE TABLE PERSON( ID NUMBER(2) PRIMARY KEY, NAME VARCHAR2(20), address VARCHAR2(20) ) CREATE TABLE PASSPORT( ID NUMBER(2) PRIMARY KEY references PERSON(ID), expire number(1), note VARCHAR2(20) )
4.映射文件配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.hibernate.entity.Person" table="person"> <id name="id" column="id" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="name" column="name" type="java.lang.String"></property> <property name="address" column="address" type="java.lang.String"></property> <!-- 關係屬性:passport 表關聯配置要點: 1.關係屬性名 2.關係對方 3.關係中的外鍵 one-to-one 默認行爲:在進行表連接時,將雙方的主鍵相連 4.級聯,對關聯表進行同級操作(查詢操作不受級聯限制) 默認:none 不級聯 save-update :當更新當前方時,級聯更新對方 delete :當刪除當前方時,級聯刪除對方 all : 所有操作都級聯 --> <one-to-one name="passport" class="com.hibernate.entity.Passport" cascade="save-update"></one-to-one> </class> <class name="com.hibernate.entity.Passport" table="passport"> <id name="id" column="id" type="java.lang.Integer"> <!-- 當前的主鍵是外鍵,要從關係對方中來 --> <generator class="foreign"> <param name="property">person</param> </generator> </id> <property name="expire"></property> <property name="note"></property> <!-- constrained: true 表示爲從表方 --> <one-to-one name="person" class="com.hibernate.entity.Person" cascade="none" constrained="true"></one-to-one> </class> </hibernate-mapping>
5.HibUtil session工具類
package com.hibernate.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibUtil { private static Configuration cfg = new Configuration().configure(); private static SessionFactory factory = cfg.buildSessionFactory(); public static Session getSession(){ return factory.getCurrentSession(); } public static Session openSession(){ return factory.openSession(); } }
6.測試插入數據
@Test public void insert(){ Session session = HibUtil.getSession(); Transaction tx = session.beginTransaction(); Person person = new Person(null, "小明", "河南"); Passport passport = new Passport(null, 3, "美國"); person.setPassport(passport); passport.setPerson(person); session.save(person); tx.commit(); }
7.測試查詢
@Test public void query(){ Session session = HibUtil.getSession(); Transaction tx = session.beginTransaction(); Person person = (Person)session.get(Person.class, 1); System.out.println(person.getPassport()); System.out.println(person); tx.commit(); }
8測試更新
@Test public void update(){ Session session = HibUtil.getSession(); Transaction tx = session.beginTransaction(); Person person = (Person)session.get(Person.class, 1); Passport passport = person.getPassport(); // 修改數據 person.setName("小強"); person.setAddress("china"); passport.setExpire(1); passport.setNote("中國"); session.update(person); tx.commit(); }
9.刪除
@Test public void delete(){ Session session = HibUtil.getSession(); Transaction tx = session.beginTransaction(); /* 1.單獨刪除從表 ,直接查詢出來,刪除就可以了。 * Passport passport = (Passport)session.get(Passport.class, 1); session.delete(passport); * * 2.刪除主表,級聯刪除從表 * 注意:要在關係映射中 添加級聯配置 * <one-to-one name="passport" class="com.hibernate.entity.Passport" cascade="save-update,delete"></one-to-one> */ Person person = (Person)session.get(Person.class, 1); session.delete(person); tx.commit(); }
第二個是一對一外鍵關聯關係
建立二個表
create table STUDENT( id NUMBER(2) primary key, age number(2), name nvarchar2(20) ) create table COMPLATE( id NUMBER(2) primary key, price number(5), brand nvarchar2(20), stu_id references STUDENT(id) unique )
2。student 實體
package com.hibernate.entity; public class Student { private Integer id; private Integer age; private String name; private Compoter compoter; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Compoter getCompoter() { return compoter; } public void setCompoter(Compoter compoter) { this.compoter = compoter; } @Override public String toString() { return "Student [id=" + id + ", age=" + age + ", name=" + name + ", compoter=" + compoter + "]"; } public Student(Integer id, Integer age, String name) { super(); this.id = id; this.age = age; this.name = name; } public Student() { super(); } }
3. compoters實體
package com.hibernate.entity; public class Compoter { private Integer id; private Integer price; private String brand; private Student student; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } @Override public String toString() { return "Compoter [id=" + id + ", price=" + price + ", brand=" + brand + "]"; } public Compoter(Integer id, Integer price, String brand) { super(); this.id = id; this.price = price; this.brand = brand; } public Compoter() { super(); } }
4.最重要的配置文件來了 student.cfg.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.entity"> <class name="Student" table="student"> <id name="id"> <generator class="increment"></generator> </id> <property name="age"/> <property name="name"/> // <one-to-one name="compoter" class="Compoter" property-ref="student" cascade="all"></one-to-one> </class> <class name="Compoter" table="complate"> <id name="id"> <generator class="increment"></generator> </id> <property name="brand"/> <property name="price"/> <many-to-one unique="true" name="student" class="Student" column="stu_id" cascade="none"></many-to-one> </class> </hibernate-mapping>
5測試,這裏只測試一個插入,查詢,刪除,更新都和上面一樣用法。
/** * 1.插入從表 * 2.插入主表 * 3.級聯插入 */ @Test public void inset(){ Session session = HibUtil.getSession(); Transaction tx = session.beginTransaction(); /* 插入主表 */ /*Student stu = new Student(null, 20, "zs"); session.save(stu);*/ /* 插入從表,數據庫要是沒有數據,自己先先添加一條 */ /* Student student = (Student)session.get(Student.class, 1); Compoter compoter = new Compoter(null, 99, "LX"); compoter.setStudent(student); session.save(compoter); */ /* 級聯插入 */ Student student = new Student(null, 19, "刷刷"); Compoter compoter = new Compoter(null, 99, "聯想"); student.setCompoter(compoter); compoter.setStudent(student); session.save(student); tx.commit(); }