(9)hibernate中OneToOne單向
阿新 • • 發佈:2018-12-14
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