jpa中的一對多配置----註解方式
JPA中配置實體類與表的對應關係以及配置表之間的關係都是用註解的方式來完成的。原來hibernate是用xml的方式來配置的,後來hibernate自身也帶註解的功能了,所以即使不用jpa,hibernate也是能使用註解功能的,其實你可以發現使用註解功能是所引用的那個jar包,就在hibernate開發包中requied資料夾下,所以你不使用jpa去寫不導jpa的jar包,註解功能也能照常用。
關於是使用hibernate還是使用JPA?能不能混合用的問題:
1、從配置persistence.xml到使用註解配置對映,然後方法全用jpa提供的,全程用jpa的那一套。
2、從配置hibernate.cfg.xml到使用hbm.xml配置對映,然後方法全用hibernate自己那一套。
3、配置使用hibernate.cfg.xml,使用註解配置對映關係,然後方法照樣用hibernate的。
4、主配置檔案是persistence.xml,對映也是使用jpa註解,但是通過EntityManager獲取到session後,通過hibernate的方法操作。
等等。。。。。。。
所以說,jpa就像是套在hibernate(或其他持久層框架)的套子,將hibernate原來的方法簡單封裝,比如把save封裝成persist,這樣不管開發者用的什麼持久層框架,只要這個框架支援jpa,我們可以不關心框架到底怎麼實現的,我們只要會使用jpa的方法就能駕馭這個持久層框架了!而session和entitymanager則可以看作是裡外連線的一個通道,連線他們兩者的就是session = entitymanager.unwrap(Session),只要打開了這個通道,那麼我們又可以由jpa的操作方式回到hibernate中,就可以使用hibernate中的方法操作。
直接看Customer 類和 Contact類,customer是主表:
Customer實體類:
package com.dimples.dao; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity //標明這就只是個實體,其他什麼都不幹 @Table(name="customer") //對應表名 public class Customer implements Serializable { @Id //標明是id欄位 @Column(name="id") //欄位名稱 @GeneratedValue(strategy=GenerationType.IDENTITY) //指定主鍵生成策略 private Integer id; @Column(name="name") private String name; @Column(name="address") private String address; @Column(name="level") private String level; //mappedBy相當於之前的inverse,由Contact裡面的custommer屬性的set方法去維護關聯關係。簡單點說就是本類放棄維護,即inverse=true @OneToMany(targetEntity=Contact.class,mappedBy="customer") private Set<Contact> contacts = new HashSet<Contact>(0); public Set<Contact> getContacts() { return contacts; } public void setContacts(Set<Contact> contacts) { this.contacts = contacts; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getLevel() { return level; } public void setLevel(String level) { this.level = level; } @Override public String toString() { return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", level=" + level + "]"; } }
這是Contact實體類:
package com.dimples.dao;
import java.io.Serializable;
import javax.persistence.*;
@Entity
@Table(name="contact")
public class Contact implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@Column(name="address")
private String address;
@Column(name="phone")
private String phone;
@ManyToOne(targetEntity=Customer.class)//體現依賴的主表
//name體現本欄位名稱,至於referencedColumnName屬性用於指定主表中對應的欄位名,可填可不填
@JoinColumn(name="customer_id",referencedColumnName="id")
private Customer customer;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
@Override
public String toString() {
return "Contact [id=" + id + ", name=" + name + ", address=" + address + ", phone=" + phone + "]";
}
}