【Hibernate】Hibernate实体关系映射——单边的一对一关系
//劉夢冰發表于2015-6-19
一對對一關系的情況要多一些,不僅在POJO層體現為一對一的,還要保證數據庫中的關系是一對一的,不允許出現一個表的兩行記錄共用另一個表中同一行記錄的情況。這可以通過設置外鍵(關聯的關系列)的唯一性約束(unique約束)來實現,也可以通過id(主鍵)的唯一性實現。
一對一的關系可以看作是一對多關系的特例。如果一對多關系的多方只有一個實體對象,那么這個關系就可看作是一對一的。因此一對一可以用類似于一對多的方式來配置。
以下通過設置外鍵唯一性來用艦船管理實現一個一對一映射的例子:
一個艦船(ship)上有若干個船員(Sailor)和一個船長(caption)。艦船與船員是一對多的關系,艦船與船長是一對一的關系。既有一對一、一對多又有多對一的關系。
Ship艦船實體類中包含四個屬性:id主鍵、name船名、caption船長、sailors船員。其中ship與caption是一對一的關系,用@OneToOne來配置,它的外鍵列用@JoinColumn配置,注意unique屬性要配置為true,利用數據庫的unique約束保證一個船長不會被兩艘艦船使用。Ship與sailors是一對多的關系,使用@OneToMany配置,用mappedBy=”ship”指定具體的配置在對方實體類中(也就是在Sailor的ship屬性中)。
Ship.java
package com.lmb.hibernate.bean;import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table;@Entity @Table(name="tb_ship") public class Ship {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Integer id;private String name;@OneToOne(cascade={CascadeType.PERSIST,CascadeType.REFRESH})@JoinColumn(name="caption_id",unique=true) //外鍵是caption_idprivate Sailor caption;@OneToMany(mappedBy="ship",cascade=CascadeType.PERSIST)private Set<Sailor> sailors=new HashSet<Sailor>();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 Sailor getCaption() {return caption;}public void setCaption(Sailor caption) {this.caption = caption;}public Set<Sailor> getSailors() {return sailors;}public void setSailors(Set<Sailor> sailors) {this.sailors = sailors;}}Sailor水手包括3個屬性:id主鍵、name姓名、ship所在的船只。Ship是多對一屬性,多個船員屬于一艘船只,用@ManyToOne來配置,但實際上,ship屬性也可以用@OneToOne來配置,從技術上講,而這在配置上是相同的。用@JoinColumn配置外鍵(也就是兩個表之間的關聯鍵)。
Sailor.java
package com.lmb.hibernate.bean;import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table;@Entity @Table(name="tb_sailor") public class Sailor {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Integer id;private String anme;@ManyToOne(cascade=CascadeType.PERSIST)@JoinColumn(name="ship") //外鍵列為shipprivate Ship ship;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getAnme() {return anme;}public void setAnme(String anme) {this.anme = anme;}public Ship getShip() {return ship;}public void setShip(Ship ship) {this.ship = ship;}}將兩個實體類添加到hibernate配置文件中去:
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration><session-factory><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/hibernate?characterEncoding=UTF-8</property><property name="connection.username">lmb</property><property name="connection.password">lmb</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property> <mapping class="com.lmb.hibernate.bean.Ship" /><mapping class="com.lmb.hibernate.bean.Sailor" /></session-factory></hibernate-configuration>總結
以上是生活随笔為你收集整理的【Hibernate】Hibernate实体关系映射——单边的一对一关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Hibernate】Hibernate
- 下一篇: 【Hibernate】Hibernate