Hibernate中一對一,一對多,多對多的寫法
阿新 • • 發佈:2019-02-09
hibernate中各類對應的bean類寫法
1、一對一的情況
假設我們用Address類和User類做一對一的對應
User類
package com.telek.model;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Generated;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="user")//如果表明和物件名不一致 則需要單獨加上該註解
public class User implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name="username")
private String username;
@Column(name="password")
private String password;
//fetch代表資料的抓取策略lazy就是指用到了該屬性才會去查詢(eager剛好相反)
@OneToOne(cascade = {CascadeType.ALL},fetch = FetchType.LAZY )
private Address address=new Address();
public User(){}
public User(String username,String password){
this.username = username;
this.password = password;
}
@return the address
public Address getAddress() {
return address;
}
@param address the address to set
public void setAddress(Address address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Address類
package com.telek.model;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String address;
@OneToOne(optional= false,fetch = FetchType.EAGER)//cascade = CascadeType.ALL,
@JoinColumn(name="uid")
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
1、一對多的情況
假設我們用Address類和User類做一對一的對應
Address類
package com.telek.model;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String address;
@ManyToOne(optional= false,fetch = FetchType.EAGER)//cascade = CascadeType.ALL,
@JoinColumn(name="uid")
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
User類
package com.telek.model;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Generated;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
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="user")//如果表明和物件名不一致 則需要單獨加上該註解
public class User implements java.io.Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name="username")
private String username;
@Column(name="password")
private String password;
//fetch代表資料的抓取策略lazy就是指用到了該屬性才會去查詢(eager剛好相反)
@OneToMany(cascade = {CascadeType.ALL},mappedBy="user",fetch = FetchType.LAZY )
private Set<Address> address = new HashSet<Address>();
public User(){}
public User(String username,String password){
this.username = username;
this.password = password;
}
public Set<Address> getAddress() {
return address;
}
public void setAddress(Set<Address> address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
最後,附上一對多情況中Dao包類的測試方法
public void OnetoMore(){//一對多配置
Session session = sessionFactory.openSession();
User user = new User();
user.setUsername("wjw");
user.setPassword("wlf");
Address add1 = new Address();
add1.setAddress("浙江");
Address add2 = new Address();
add2.setAddress("北京");
add1.setUser(user);//在多的一方告訴hibernate我這個物件屬於誰
add2.setUser(user);
user.getAddress().add(add1);//在少的一端告訴hibernate我可以新增誰進來
user.getAddress().add(add2);
session.beginTransaction();
session.save(user);
session.close();
}
3、多對多的情況
假設我們用Tag類和Topic類作為演示
Tag類
package com.telek.model;
// Generated 2016-3-4 9:16:37 by Hibernate Tools 4.3.1.Final
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* Tag generated by hbm2java
*/
@Entity
@Table(name="tag"
,catalog="springdemo"
)
public class Tag implements java.io.Serializable {
private Integer tagid;
private String tag;
private Set<Topic> topic=new HashSet<Topic>();
public Tag() {
}
public Tag(String tag) {
this.tag = tag;
}
@Id @GeneratedValue(strategy=IDENTITY)
@Column(name="tagid", unique=true, nullable=false)
public Integer getTagid() {
return this.tagid;
}
public void setTagid(Integer tagid) {
this.tagid = tagid;
}
@Column(name="tag")
public String getTag() {
return this.tag;
}
public void setTag(String tag) {
this.tag = tag;
}
/**
* @return the topic
*/
@ManyToMany(cascade = {CascadeType.ALL},mappedBy="tag",fetch = FetchType.LAZY )
public Set<Topic> getTopic() {
return topic;
}
/**
* @param topic the topic to set
*/
public void setTopic(Set<Topic> topic) {
this.topic = topic;
}
}
Topic類
package com.telek.model;
// Generated 2016-3-4 9:16:37 by Hibernate Tools 4.3.1.Final
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
/**
* Topic generated by hbm2java
*/
@Entity
@Table(name="topic"
,catalog="springdemo"
)
public class Topic implements java.io.Serializable {
private Integer topicid;
private String title;
private String context;
private Set<Tag> tag = new HashSet<Tag>();
public Topic() {
}
public Topic(String title, String context) {
this.title = title;
this.context = context;
}
@Id @GeneratedValue(strategy=IDENTITY)
@Column(name="topicid", unique=true, nullable=false)
public Integer getTopicid() {
return this.topicid;
}
public void setTopicid(Integer topicid) {
this.topicid = topicid;
}
@Column(name="title")
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
@Column(name="context")
public String getContext() {
return this.context;
}
public void setContext(String context) {
this.context = context;
}
/**
* @return the tag
*/
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="topicandtag",joinColumns=@JoinColumn(name="topicid"),inverseJoinColumns=@JoinColumn(name="tagid"))
public Set<Tag> getTag() {
return tag;
}
/**
* @param tag the tag to set
*/
public void setTag(Set<Tag> tag) {
this.tag = tag;
}
}
最後在Dao裡面寫一個方法作為演示
public void ManyToMany(){
Session session = sessionFactory.openSession();
Topic topic = new Topic();
topic.setTitle(("大保健"));
topic.setContext("來玩來玩");
Topic topic2 = new Topic();
topic2.setTitle(("大保健"));
topic2.setContext("來玩來玩呀");
Tag tag1 = new Tag();tag1.setTag("服務");
Tag tag2 = new Tag();tag2.setTag("保健");
Set<Tag> tags = new HashSet<Tag>();
tags.add(tag1);tags.add(tag2);
topic.setTag(tags);
Set<Topic> topics = new HashSet<Topic>();
topics.add(topic);
topics.add(topic2);
tag1.setTopic(topics);
tag2.setTopic(topics);
session.beginTransaction();
session.save(topic);
session.getTransaction().commit();
session.close();
}
發現關係表和Tag表和Topic表都插入資料為正常
最後,附上資料庫表的情況
另外,如果在topic和tag兩邊都加上
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="topicandtag",joinColumns=@JoinColumn(name="tagid"),inverseJoinColumns=@JoinColumn(name="topicid"))
即可以不用兩邊set關係,只用一邊關聯就可以兩邊都存入資料庫