hibernate之關於一對一單向,雙向關聯映射

來源:互聯網
上載者:User

標籤: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之關於一對一單向,雙向關聯映射

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.