一、 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 + "]";
}
}
- 用戶表與用戶產品表(一對多、關聯字段查詢)
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 + "]";
}
}
- 用戶表與身份號碼錶(一對一)
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;
}
}
- 用戶表和寵物貓表(多對多)
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();