提示:表与表之间的映射关系通过外键或中间表建立联系:
- 单向外键映射关系:这里主要是指在两个映射表对象类(一对一关系)之间只有一方包含另一方的引用,比如映射对象类A与映射表对象B之间,如果只有A中有一个属性是对B的引用 private B b;那么就称为单向外键关系。
- 双向外键映射关系;这里指双方都包含一方的引用,但如果是没有中间表,那么就要指定主控方与被控方。
上面所说的单向外键关系与映射外键关系虽然存在着引用的差别,但是(比如一对一或者多对多等)在建表的时候,表的结构是一样的,比如主控方是A被控方是B,两种情况下表结构一样,都是A对应的表中包含B的主键作为外键,不同的是,单向外键关系,从主控方的对象可以获取被控方对象,而双向外键关系则可以从任何一方获取另一方的对象。差别在于hibernate操作数据库的时候,是否连带关联操作被控方。
这里使用的是Hibernate5 而且里面有一个包与javaEE库有冲突 :在用@JoinColumn(name=”pid”)创建外键一直报错 是因为 javax.persistence.jar与 hibernate中的hibernate-jpa-2.1-api-1.0.0.Final.jar冲突,可以先删除javaEE类库然后在重新添加就可以了。
这里使用的是hibernate5
配置文件:
<?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" >
<hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">12345</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.current_session_context_class">thread</property>
<!--
<mapping class="com.hibernate.environment.Students"/>
<mapping class="com.hibernate.environment.Person"/>
<mapping class="com.hibernate.environment.Dog"/>
-->
<mapping class="com.hibernate.relationship.oneTone.IdCardOneToOneFK"/>
<mapping class="com.hibernate.relationship.oneTone.PersonOneToOneFK"/>
</session-factory>
</hibernate-configuration>
1、一对一单向外键关系
主控方person类(含有IdCard类引用,并且数据库表中含有IdCard对应表字段作为外键)
package com.hibernate.relationship.oneTone;
import java.io.Serializable;
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.OneToOne;
//一对一单向外键
@Entity
public class PersonOneToOneFK {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY ) //整型可以指定默认增长策略
private int wid;
private int age;
@OneToOne(cascade=CascadeType.ALL) //全级联关系
@JoinColumn(name="pid",unique=true) //指定外键名称为pid
private IdCardOneToOneFK idCard;
public PersonOneToOneFK() {
}
public PersonOneToOneFK( int age, IdCardOneToOneFK idCard) {
this.age = age;
this.idCard = idCard;
}
public int getWid() {
return wid;
}
public void setWid(int wid) {
this.wid = wid;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public IdCardOneToOneFK getIdCard() {
return idCard;
}
public void setIdCard(IdCardOneToOneFK idCard) {
this.idCard = idCard;
}
}
被控方IdCard类
package com.hibernate.relationship.oneTone;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.GenericGenerator;
@Entity
public class IdCardOneToOneFK {
@Id
@GeneratedValue(generator="pid")
@GenericGenerator(name="pid",strategy="assigned")
@Column(length=18)
private String pid; //主键是字符串类型需要指定主键生成器以及生成策略,同时还要指定长度,否则默认255长度会报错不能作为主键长度
@Column(length=24)
private String name;
public IdCardOneToOneFK() {
super();
// TODO Auto-generated constructor stub
}
public IdCardOneToOneFK(String pid, String name) {
super();
this.pid = pid;
this.name = name;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
</