標籤:hibernate之關於一對一單向雙向關 one-to-one單雙向關聯映射
【hibernate】之關於一對一單向,雙向關聯映射
首先我們來看,Hibernate官方對於一對一單向關聯的解釋:
基於外部索引鍵關聯的單向一對一關聯和單向多對一關聯幾乎是一樣的。唯一的不同就是單向一對一關
聯中的外鍵欄位具有唯一性限制式。
ok,那我們也可以這樣理解,一對一其實就是多對一關聯的特殊形式,我們知道Hibernate的配置方式有兩種,分別是Annotations,XML兩種配置方式!
Annotations的一對一單向關聯映射
人(User)和身 份 證號(Card)
@Entity@Table(name="t_user")publicclass User { private Integer id; private String name; private Card card; @OneToOne @JoinColumn(name="card_id",unique=true)//name是自訂關聯外鍵的列名 public Card getCard() { returncard; } publicvoid setCard(Card card) { this.card = card; } @Id @GeneratedValue public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } @Column(name="name") public String getName() { returnname; } publicvoid setName(Stringname) { this.name = name; }
@Entity@Table(name="t_card")publicclass Card { private Integer id; private String num; @Id @GeneratedValue public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } @Column(name="card_id") public String getNum() { returnnum; } publicvoid setNum(Stringnum) { this.num = num; }}
XML一對一單向關聯
Person和Group,一個人只能在一個組
publicclass Group { private Integer id; private String name; public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } public String getName() { returnname; } publicvoid setName(Stringname) { this.name = name; }}
publicclass Person { private Integer id; private String name; private Integer age; private Group group; public Group getGroup() { returngroup; } publicvoid setGroup(Groupgroup) { this.group = group; } public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } public String getName() { return name; } public void setName(Stringname) { this.name = name; } public Integer getAge() { return age; } publicvoid setAge(Integer age){ this.age = age; }}
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="csg.hibernate.entity"> <class name="Group" table="t_group"> <id name="id"> <column name="id"/> <generator class="native" /> </id> <property name="name" /> </class></hibernate-mapping>
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="csg.hibernate.entity"> <class name="Person" table="t_person"> <id name="id"> <column name="id"/> <generator class="native" /> </id> <property name="name" /> <property name="age" /> <many-to-one name="group" column="group_id" unique="true" not-null="true" /> </class></hibernate-mapping>
Ok,到這裡,大家就有點疑惑,為什麼我們的Annotaions配置採用的是one-to-one而我們的xml配置採用的是many-to-one呢?
當然XML配置是我參考Hibernate的文檔而來,因為一對一本身就是多對一的特殊形式,
但是配置many-to-one又給我們一種暗示,多個***號對應一個人,所以Hibernate根據這種情況提供unique唯一性來確認!
Annotations一對一雙向關聯映射
User和Card
@Entity@Table(name="t_user")publicclass User { private Integer id; private String name; private Card card; @OneToOne @JoinColumn(name="card_id",unique=true)//name主要是自訂關聯外鍵的列名 public Card getCard() { returncard; } publicvoid setCard(Cardcard) { this.card = card; } @Id @GeneratedValue public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } @Column(name="name") public String getName() { returnname; } publicvoid setName(Stringname) { this.name = name; }}
@Entity@Table(name="t_card")publicclass Card { private Integer id; private String num; private User user; @OneToOne(mappedBy="card")//mappedBy的意思是指定User中的card作為關聯外鍵,否則User和Card都會出現外鍵 public User getUser() { returnuser; } publicvoid setUser(Useruser) { this.user = user; } @Id @GeneratedValue public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } @Column(name="card_id") public String getNum() { returnnum; } publicvoid setNum(Stringnum) { this.num = num; }}
Ok?那麼我們可以看到在Annotaions中的配置都是ont-to-one,那麼我們在xml中的配置呢?
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="csg.hibernate.entity"> <class name="Person" table="t_person"> <id name="id"> <column name="id"/> <generator class="native" /> </id> <property name="name" /> <property name="age" /> <many-to-one name="group" column="group_id" unique="true" not-null="true" /> </class></hibernate-mapping>
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="csg.hibernate.entity"> <class name="Group" table="t_group"> <id name="id"> <column name="id"/> <generator class="native" /> </id> <property name="name" /> <!-- many-to-one這種配置會分別在兩個表中都產生外鍵,造成資料的多餘,通常我們採用one-to-one的形式在xml中配置 --> <many-to-one name="Person" column="person_id" unique="true" /> <!-- <one-to-onename="person"property-ref="group"/> --> </class></hibernate-mapping>
ok,到這裡一對一的單雙向關聯映射基本上就是這樣,隨筆之作,有問題,請留言!
hibernate之關於一對一單向,雙向關聯映射