JPA使用指南 javax.persistence的注解配置講解


轉自http://67566894.iteye.com/blog/659829

示例

@SuppressWarnings("serial")  
@Entity  
@Table(name="T_X")  
public class X implements Serializable  
{  
    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)  
    private int id;  
  
    @Column(length=32)  
    private String name;  
      
         @Transient   //表示此數據不在數據庫表里建立屬性  
         private String temp;  
  
    @Temporal(TemporalType.TIMESTAMP) //這個是帶時分秒的類型  
    private Date date;  
  
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "x")  
    private A a;  
}  
@SuppressWarnings("serial")  
@Entity  
@Table(name="T_A")  
public class A implements Serializable  
{  
    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)  
    private int id;  
  
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "a", fetch = FetchType.EAGER)  
    private List<B> b = new ArrayList<B>();  
  
    @OneToOne()  
    @JoinColumn(name = "x_Id") //加這句后就會雙方共同維護關系  
    private X x;  
}  
  
@SuppressWarnings("serial")  
@Entity  
public class B implements Serializable{  
         @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)  
    protected int id;  
  
    @ManyToOne()  
    @JoinColumn(name = "a_id")  
    protected A a;  
}  

要注意的是:fetch = FetchType.EAGER這句話在一個類里面只能出現一次,出現兩次就會報錯“cannot simultaneously fetch multiple bags”,要把其他的改為fetch = FetchType.LAZY延遲加載就可以了。聽說把List集合改為Set也能解決這個錯誤。 

其他要點: 
1、@Table(name="T_X")這句話可以不寫,不寫就已類名作為表名 

2、如果想讓兩個類的屬性生成一個數據表,在一個類里這樣加入另一個類即可: @Embedded 
private C c; 

3、如果想要一個類繼承另一個類的所有屬性,則在父類里這樣寫: 
@SuppressWarnings("serial") 
@Entity 
@MappedSuperclass   //增加這一行 
並把父類的所有屬性的private改為protected即可 

4、建議在一對多關聯中在"一"方用延遲加載"多"方可以在HQL中顯式的"迫切左外連接" left join fetch 這樣做Hibernate可以少訪問數據庫,也可以用"@BatchSize(size = 5)"來減少訪問數據庫的次數 

 

1. @Id 聲明屬性為主鍵 

2. @GeneratedValue表示主鍵是自動生成策略,一般該注釋和 @Id 一起使用 

3. @Entity 任何 hibernte 映射對象都要有次注釋 

4. @Table(name = “tablename”) 類聲明此對象映射到哪個表 

5. @Column(name = “Name”,nullable=false,length=32) 聲明數據 庫字段和類屬性對應關系 

6. @Lob 聲明字段為 Clob 或 Blob 類型 

7. @OneToMany(mappedBy=”order”,cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
   @OrderBy(value = “id ASC”) 
   一對多聲明,和 ORM 產品聲明類似,一看就明白了。 
   @ManyToOne(cascade=CascadeType.REFRESH,optional=false) 
   @JoinColumn(name = “order_id”) 
   聲明為雙向關聯 

8. @Temporal(value=TemporalType.DATE) 做日期類型轉換。 

9. @OneToOne(optional= true,cascade = CascadeType.ALL, mappedBy = “person”) 
   一對一關聯聲明 
   @OneToOne(optional = false, cascade = CascadeType.REFRESH) 
   @JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true) 
   聲明為雙向關聯 

10. @ManyToMany(mappedBy= “students”) 
   多對多關聯聲明。 
  @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) 
  @JoinTable(name = “Teacher_Student”, 
    joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName = “teacherid”)}, 
    inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName = 
    “studentid”)}) 
   多對多關聯一般都有個關聯表,是這樣聲明的! 

11. @Transiten表示此屬性與表沒有映射關系,是一個暫時的屬性 

12. @Cache(usage= CacheConcurrencyStrategy.READ_WRITE)表示此對象應用緩存 

JPA規范 
@Entity:通過@Entity注解將一個類聲明為一個實體bean 

@Table:通過 @Table注解可以為實體bean映射指定表,name屬性表示實體所對應表的名稱,如果沒有定義 @Table,那么系統自動使用默認值:實體的類名(不帶包名) 

@Id:用於標記屬性的主鍵 

@Column:表示持久化屬性所映射表中的字段,如果屬性名與表中的字段名相同,則可以省略@Column注解,另外有兩種方式標記,一是放在屬性前,另一種是放在getter方法前,例如: 

@Column(name = "EMPLOYEE_NAME") 

private String employee_name; 或者 

@Column(name = "EMPLOYEE_NAME") 

public String getEmployee_name() { 

return employee_name; 

} 這兩種方式都是正解的,根據個人喜好來選擇。大象偏向於第二種,並且喜歡將屬性名與字段名設成一樣的,這樣可以省掉@Column注解,使代碼更簡潔。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM