第一:ORM映射元數據
JPA支持XML和JDK 註釋(也可譯作註解)兩種元數據的形式,元數據描述對象和表之間的映射關係,框架據此將實體對象持久化到數據庫表中。
第二:Java持久化API
用來操作實體對象,執行CRUD操作,框架在後臺替我們完成所有的事情,開發者可以從繁瑣的JDBC和SQL代碼中解脫出來。
第三:查詢語言
這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。
現在就用第一種技術來實現一對多的映射,對應到mysql中。一對多的處理有兩種處理方式,第一種是映射成第三張表,第二種是映射成主外鍵關係。
需要引用的jar包除了hibernate的jar包,還有:
第一種:以一的主鍵作爲多的外鍵
Group.java
package com.tgb.zhudan;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_group")
public class Group {
private int id;
private String name;
private List<User> user;
@Id
@GeneratedValue
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;
}
/*@OneToMany*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "id")//指向多的那方的pojo的關聯外鍵字段
public List<User> getUser() {
return user;
}
public void setUser(List<User> user) {
this.user = user;
}
}
User.java
package com.tgb.zhudan;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_group")
public class Group {
private int id;
private String name;
private List<User> user;
@Id
@GeneratedValue
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;
}
/*@OneToMany*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "id")//指向多的那方的pojo的關聯外鍵字段
public List<User> getUser() {
return user;
}
public void setUser(List<User> user) {
this.user = user;
}
}
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_jpa_one2many</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping class="com.tgb.zhudan.Group"/>
<mapping class="com.tgb.zhudan.User"/>
</session-factory>
</hibernate-configuration>
ExportDB:
package com.tgb.zhudan;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/**
* 將hbm生成ddl
* @author Administrator
*
*/
public class ExportDB {
public static void main(String[] args) {
//默認讀取hibernate.cfg.xml文件
Configuration cfg = new AnnotationConfiguration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}
生成的數據庫表如下:t_group表:
t_user表:
總結:從上面的兩張數據表可以看到一端(t_group)的id作爲了外鍵存在了多端(t_user),生成一個叫group_id的字段作爲一端(t_group)的在多端(t_user)的外鍵。
如果我想讓這種一對多關係的實體在數據庫中的體現是第三種表而不是外鍵關係,那麼我又應該怎麼寫jpa註解呢?下篇博客我們再說。