1. 程式人生 > >(9)hibernate中OneToOne單向

(9)hibernate中OneToOne單向

OneToOne單向:即Person和Idcard(身份證),一個人只能有一張身份證,單向的話在那一端設定外來鍵都可以,下面在idcard這一端設定外來鍵

Person:

public class Person {
private int id;
private String name;
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}

}

Idcard :

public class IdCard {
private int id;
private int number;
private Person person;

public Person getPerson() {
	return person;
}
public void setPerson(Person person) {
	this.person = person;
}
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public int getNumber() {
	return number;
}
public void setNumber(int number) {
	this.number = number;
}

}

IdCard.hbm.xml:

<hibernate-mapping>
    <class name="model.IdCard" table="IDCARD">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="number" type="int">
            <column name="NUMBER" />
        </property>
        <many-to-one name="person" unique="true">
            <column name="P_ID" />
        </many-to-one>
    </class>
</hibernate-mapping>

注意:(1).在idcard這端設定manytoone,即一個人有多個卡,由於是身份證,所以一個人只能一個卡,所以增加unique="true",

其中name是屬性名稱(private Person person;裡面的person),colum是外來鍵名稱

test01:

void test1() {
		Session s=null;
		try {
			s=HibernateUtil.getSession();
			s.beginTransaction();
			Person p=new Person();
			p.setName("test-1");
			s.save(p);
			
			IdCard idcard=new IdCard();
			idcard.setNumber(111);
			idcard.setPerson(p);
			s.save(idcard);
					
			s.getTransaction().commit();
		} catch (Exception e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
			s.getTransaction().rollback();
		}finally {
			HibernateUtil.closeSession(s);
		}
		
	}

注意:(1).先新增person再新增idcard,和之前的先新增一再新增多類似

test02:

void test2() {
		Session s=null;
		try {
			s=HibernateUtil.getSession();
			s.beginTransaction();
			Person p=s.load(Person.class, 1);
			IdCard idcard=new IdCard();
			idcard.setNumber(123);
			idcard.setPerson(p);
			s.save(idcard);
			s.getTransaction().commit();
		} catch (Exception e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
			s.getTransaction().rollback();
		}finally {
			HibernateUtil.closeSession(s);
		}
		
	}

注意:(1).由於設定了unique="true",再次為id為1的person(需要用load載入id為1的person)新增新的idcard(new Idcard()),違背了一人一張卡的原則,所以報錯

(2).設定了unique="true",但是idcard表中的P_ID還是沒有設定UNIQUE,所以我是手動在SQLyog把P_ID設定為UNIQUE