關於hibernate和的jpa使用經驗(關聯字段與關聯表OneToOne、OneToMany、ManyToMany)

一、 jpa入門使用經驗小結

**********************************註解數據庫表的屬性**********************************
1. @Entity :指出該Java類爲實體類,將映射到指定的數據庫=====>class前
2. @Table:說明該實體類在數據庫中對應表名(不同名必用)=====>class前
3. @Id :映射主鍵(放在getter方法之前)=====>變量屬性前/getter方法之前
4. @GeneratedValue :用於標註主鍵的生成策略,通過strategy屬性指定=====>變量屬性前
5. @Column :映射數據表的列名,指定unique,length等(不同名必用)=====>變量屬性前/getter方法之前
6. @Basic : 表示一個簡單的屬性到數據庫表的字段的映射,對於沒有任何標註的 getXxxx() 方法,默認即爲@Basic
7. @Transient :如果該屬性在數據庫表中沒有對應的字段,則需要添加該註解,表示該字段不需要映射,避免加載失敗
8. @Temporal :可以用來調整date精度



1) fetch: 表示該屬性的讀取策略,有 EAGER 和 LAZY 兩種,分別表示主支抓取和延遲加載,默認爲 EAGER.
2) optional: 表示該屬性是否允許爲null, 默認爲true


**********************************註解表關聯字段**********************************
1. @Formula:用來關聯其他表的字段=====>變量屬性前
	注意點:sql語句如果有where,則表需要使用別名
	
2. 關聯表
1)多對一關係
   @ManyToOne(fetch = FetchType.LAZY)和@JoinColumn(name = "many表外鍵字段名"):用來關聯其他表
   @OneToMany(mappedBy = "many表創建one表的實例變量名"):用來關聯其他表
	注意點:兩個需要配套使用,缺一不可
2)一對一關係
   @OneToOne(fetch = FetchType.LAZY)和@JoinColumn(name = "id")
   @OneToOne(mappedBy = "user")
3)多對對關係
   @ManyToMany
   @JoinTable(name = "S_USER_CAT", joinColumns = { @JoinColumn(name = "SSCAT") }, inverseJoinColumns = { @JoinColumn(name = "SSUSER") })
   @ManyToMany(mappedBy = "user")

二、 代碼演示
用戶表user

package ffcs.cn.peam.user.domain;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import ffcs.cn.peam.card.domain.Card;
import ffcs.cn.peam.cat.domain.Cat;
import ffcs.cn.peam.product.domain.Product;

@Entity
@Table(name = "S_USER")
public class User {
	@Id
	@GeneratedValue
	@Column(name = "ID")
	private int id;

	@Column(name = "PRODUCT_ID")
	private int productId;

	private String name;

	private String password;

	private String authority;

	// 一對多(用戶-水果產品)
	@OneToMany(mappedBy = "user")
	private Set<Product> product;

	// 一對一(用戶-身份號碼)
	@OneToOne(mappedBy = "user")
	private Card card;

	// 多對多(用戶-寵物貓)
	@ManyToMany(mappedBy = "user")
	private Set<Cat> cat;

	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;
	}

	@Column(name = "PASSWORD")
	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Column(name = "AUTHORITY")
	public String getAuthority() {
		return authority;
	}

	public void setAuthority(String authority) {
		this.authority = authority;
	}

	@Column(name = "PRODUCT_ID")
	public int getProductId() {
		return productId;
	}

	public void setProductId(int productId) {
		this.productId = productId;
	}

	public Card getCard() {
		return card;
	}

	public void setCard(Card card) {
		this.card = card;
	}

	public Set<Product> getProduct() {
		return product;
	}

	public void setProduct(Set<Product> product) {
		this.product = product;
	}

	public Set<Cat> getCat() {
		return cat;
	}

	public void setCat(Set<Cat> cat) {
		this.cat = cat;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", productId=" + productId + ", name=" + name
				+ ", password=" + password + ", authority=" + authority + "]";
	}

}
  1. 用戶表與用戶產品表(一對多、關聯字段查詢)
package ffcs.cn.peam.product.domain;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Formula;

import ffcs.cn.peam.user.domain.User;


@Entity
@Table(name = "PRODUCT")
public class Product {
	@Id
	@GeneratedValue
	@Column(name = "ID")
	private int id;

	@Column(name = "NAME")
	private String name;

	@Column(name = "PRICE")
	private float price;

	@Column(name = "TIME")
	private Date time;

	@Column(name = "OWNER")
	private int owner;

	@Formula("(select t.name from s_user t where t.id=OWNER)")
	private String ownerName;

   @ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "owner")
	private User user;

	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;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
	}

	public Date getTime() {
		return time;
	}

	public void setTime(Date time) {
		this.time = time;
	}

	public int getOwner() {
		return owner;
	}

	public void setOwner(int owner) {
		this.owner = owner;
	}



	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String getOwnerName() {
		return ownerName;
	}

	public void setOwnerName(String ownerName) {
		this.ownerName = ownerName;
	}

	@Override
	public String toString() {
		return "Product [id=" + id + ", name=" + name + ", price=" + price
				+ ", time=" + time + ", owner=" + owner + "]";
	}

}
  1. 用戶表與身份號碼錶(一對一)
package ffcs.cn.peam.card.domain;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import ffcs.cn.peam.product.domain.Product;
import ffcs.cn.peam.user.domain.User;

@Entity
@Table(name = "S_CARD")
public class Card {
	@Id
	@GeneratedValue
	private int id;

	@Column(name = "CARD_NUMBER")
	private String cardNumber;

	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id")
	private User user;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCardNumber() {
		return cardNumber;
	}

	public void setCardNumber(String cardNumber) {
		this.cardNumber = cardNumber;
	}


	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}




}
  1. 用戶表和寵物貓表(多對多)
package ffcs.cn.peam.cat.domain;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import ffcs.cn.peam.product.domain.Product;
import ffcs.cn.peam.user.domain.User;

@Entity
@Table(name = "S_CAT")
public class Cat {
	@Id
	@GeneratedValue
	@Column(name = "ID")
	private int id;

	@Column(name = "NAME")
	private String name;

	@ManyToMany
	@JoinTable(name = "S_USER_CAT", joinColumns = { @JoinColumn(name = "SSCAT") }, inverseJoinColumns = { @JoinColumn(name = "SSUSER") })
	private Set<User> user;

	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;
	}

	public Set<User> getUser() {
		return user;
	}

	public void setUser(Set<User> user) {
		this.user = user;
	}

}

三、 測試代碼
這裏是使用criteria進行測試的,具體配置看我前篇博客



		Resource resource = new ClassPathResource(	"ffcs/cn/system/applicationContext.xml");
		BeanFactory factory = new XmlBeanFactory(resource);
		SessionFactory sessionFactory = (SessionFactory) factory
				.getBean("sessionFactory");
		Session s = sessionFactory.openSession();
		s.beginTransaction();
		Criteria c = s.createCriteria(Cat.class);

		List<Cat> ps = c.list();

		for (Cat p : ps) {
			System.out.println(p.getUser());
		}
		s.getTransaction().commit();
		s.close();
		sessionFactory.close();

		
	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章