隨筆 - 100  文章 - 50  trackbacks - 0
          <2014年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(3)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          收藏夾

          我收藏的一些文章!

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          @Table 
          Table用來(lái)定義entity主表的name,catalog,schema等屬性。 
          屬性說(shuō)明: 

          • name:表名
          • catalog:對(duì)應(yīng)關(guān)系數(shù)據(jù)庫(kù)中的catalog
          • schema:對(duì)應(yīng)關(guān)系數(shù)據(jù)庫(kù)中的schema
          • UniqueConstraints:定義一個(gè)UniqueConstraint數(shù)組,指定需要建唯一約束的列


          Java代碼  收藏代碼
          1. @Entity  
          2. @Table(name="CUST")  
          3. public class Customer { ... }  



          @SecondaryTable 
          一個(gè)entity class可以映射到多表,SecondaryTable用來(lái)定義單個(gè)從表的名字,主鍵名字等屬性。 
          屬性說(shuō)明: 
          • name:表名
          • catalog:對(duì)應(yīng)關(guān)系數(shù)據(jù)庫(kù)中的catalog
          • pkJoin:定義一個(gè)PrimaryKeyJoinColumn數(shù)組,指定從表的主鍵列
          • UniqueConstraints:定義一個(gè)UniqueConstraint數(shù)組,指定需要建唯一約束的列

          下面的代碼說(shuō)明Customer類(lèi)映射到兩個(gè)表,主表名是CUSTOMER,從表名是CUST_DETAIL,從表的主鍵列和主表的主鍵列類(lèi)型相同,列名為CUST_ID。 

          Java代碼  收藏代碼
          1. @Entity  
          2. @Table(name="CUSTOMER")  
          3. @SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))  
          4. public class Customer { ... }  




          @SecondaryTables 
          當(dāng)一個(gè)entity class映射到一個(gè)主表和多個(gè)從表時(shí),用SecondaryTables來(lái)定義各個(gè)從表的屬性。 
          屬性說(shuō)明: 
          • value:定義一個(gè)SecondaryTable數(shù)組,指定每個(gè)從表的屬性。


          Java代碼  收藏代碼
          1. @Table(name = "CUSTOMER")  
          2. @SecondaryTables( value = {  
          3. @SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),  
          4. @SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })  
          5. public class Customer {}  



          @UniqueConstraint 
          UniqueConstraint定義在Table或SecondaryTable元數(shù)據(jù)里,用來(lái)指定建表時(shí)需要建唯一約束的列。 
          屬性說(shuō)明: 
          • columnNames:定義一個(gè)字符串?dāng)?shù)組,指定要建唯一約束的列名。


          Java代碼  收藏代碼
          1. @Entity  
          2. @Table(name="EMPLOYEE",uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})})  
          3. public class Employee { ... }  



          @Column 
          Column元數(shù)據(jù)定義了映射到數(shù)據(jù)庫(kù)的列的所有屬性:列名,是否唯一,是否允許為空,是否允許更新等。 
          屬性說(shuō)明: 
          • unique:是否唯一
          • nullable:是否允許為空
          • insertable:是否允許插入
          • updatable:是否允許更新
          • columnDefinition:定義建表時(shí)創(chuàng)建此列的DDL
          • secondaryTable:從表名。如果此列不建在主表上(默認(rèn)建在主表),該屬性定義該列所在從表的名字。


          Java代碼  收藏代碼
          1. public class Person {  
          2.     @Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)  
          3.     private String name;  
          4.     @Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")  
          5.     private byte[] picture;  



          @JoinColumn 
          如果在entity class的field上定義了關(guān)系(one2one或one2many等),我們通過(guò)JoinColumn來(lái)定義關(guān)系的屬性。JoinColumn的大部分屬性和Column類(lèi)似。 
          屬性說(shuō)明: 
          • unique:是否唯一
          • referencedColumnName:該列指向列的列名(建表時(shí)該列作為外鍵列指向關(guān)系另一端的指定列)
          • nullable:是否允許為空
          • insertable:是否允許插入
          • updatable:是否允許更新
          • columnDefinition:定義建表時(shí)創(chuàng)建此列的DDL
          • secondaryTable:從表名。如果此列不建在主表上(默認(rèn)建在主表),該屬性定義該列所在從表的名字。

          下面的代碼說(shuō)明Custom和Order是一對(duì)一關(guān)系。在Order對(duì)應(yīng)的映射表建一個(gè)名為CUST_ID的列,該列作為外鍵指向Custom對(duì)應(yīng)表中名為ID的列。 

          Java代碼  收藏代碼
          1. public class Custom {  
          2.     @OneToOne  
          3.     @JoinColumn(name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)  
          4.     public Order getOrder() {  
          5.     return order;  
          6.     }  




          @JoinColumns 
          如果在entity class的field上定義了關(guān)系(one2one或one2many等),并且關(guān)系存在多個(gè)JoinColumn,用JoinColumns定義多個(gè)JoinColumn的屬性。 
          屬性說(shuō)明: 
          • value:定義JoinColumn數(shù)組,指定每個(gè)JoinColumn的屬性。

          下面的代碼說(shuō)明Custom和Order是一對(duì)一關(guān)系。在Order對(duì)應(yīng)的映射表建兩列,一列名為CUST_ID,該列作為外鍵指向Custom對(duì)應(yīng)表中名為ID的列,另一列名為CUST_NAME,該列作為外鍵指向Custom對(duì)應(yīng)表中名為NAME的列。 

          Java代碼  收藏代碼
          1. public class Custom {  
          2.     @OneToOne  
          3.     @JoinColumns({  
          4.         @JoinColumn(name="CUST_ID", referencedColumnName="ID"),  
          5.         @JoinColumn(name="CUST_NAME", referencedColumnName="NAME")  
          6.     })  
          7.     public Order getOrder() {  
          8.     return order;  
          9.     }  



          @Id 
          聲明當(dāng)前field為映射表中的主鍵列。id值的獲取方式有五種:TABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracle和DB2支持SEQUENCE,SQL Server和Sybase支持IDENTITY,mysql支持AUTO。所有的數(shù)據(jù)庫(kù)都可以指定為AUTO,我們會(huì)根據(jù)不同數(shù)據(jù)庫(kù)做轉(zhuǎn)換。NONE(默認(rèn))需要用戶(hù)自己指定Id的值。
          屬性說(shuō)明: 
          • generate:主鍵值的獲取類(lèi)型
          • generator:TableGenerator的名字(當(dāng)generate=GeneratorType.TABLE才需要指定該屬性)

          下面的代碼聲明Task的主鍵列id是自動(dòng)增長(zhǎng)的。(Oracle和DB2從默認(rèn)的SEQUENCE取值,SQL Server和Sybase該列建成IDENTITY,mysql該列建成auto increment。) 

          Java代碼  收藏代碼
          1.  @Entity  
          2.  @Table(name = "OTASK")  
          3.  public class Task {  
          4. @Id(generate = GeneratorType.AUTO)  
          5. public Integer getId() {  
          6.  return id;  
          7. }  
          8.  }  

            

          @IdClass 
          當(dāng)entity class使用復(fù)合主鍵時(shí),需要定義一個(gè)類(lèi)作為id class。id class必須符合以下要求:類(lèi)必須聲明為public,并提供一個(gè)聲明為public的空構(gòu)造函數(shù)。必須實(shí)現(xiàn)Serializable接,覆寫(xiě)equals()和hashCode()方法。entity class的所有id field在id class都要定義,且類(lèi)型一樣。 
          屬性說(shuō)明: 
          • value:id class的類(lèi)名

          下面的代碼聲明Task的主鍵列id是自動(dòng)增長(zhǎng)的。(Oracle和DB2從默認(rèn)的SEQUENCE取值,SQL Server和Sybase該列建成IDENTITY,mysql該列建成auto increment。) 

          Java代碼  收藏代碼
          1. public class EmployeePK implements java.io.Serializable{  
          2.    String empName;  
          3.    Integer empAge;  
          4. public EmployeePK(){}  
          5. public boolean equals(Object obj){ ......}  
          6. public int hashCode(){......}  
          7. }  
          8. @IdClass(value=com.acme.EmployeePK.class)  
          9. @Entity(access=FIELD)  
          10. public class Employee {  
          11.     @Id String empName;  
          12.     @Id Integer empAge;  
          13. }  



          @MapKey 
          在一對(duì)多,多對(duì)多關(guān)系中,我們可以用Map來(lái)保存集合對(duì)象。默認(rèn)用主鍵值做key,如果使用復(fù)合主鍵,則用id class的實(shí)例做key,如果指定了name屬性,就用指定的field的值做key。 
          屬性說(shuō)明: 
          • name:用來(lái)做key的field名字

          下面的代碼說(shuō)明Person和Book之間是一對(duì)多關(guān)系。Person的books字段是Map類(lèi)型,用Book的isbn字段的值作為Map的key。 

          Java代碼  收藏代碼
          1.    @Table(name = "PERSON")  
          2.    public class Person {  
          3. @OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")  
          4. @MapKey(name = "isbn")  
          5. private Map books = new HashMap();  
          6.    }  



          @MappedSuperclass 
          使用@MappedSuperclass指定一個(gè)實(shí)體類(lèi)從中繼承持久字段的超類(lèi)。當(dāng)多個(gè)實(shí)體類(lèi)共享通用的持久字段或?qū)傩詴r(shí),這將是一個(gè)方便的模式。 

          您可以像對(duì)實(shí)體那樣使用任何直接和關(guān)系映射批注(如 @Basic 和 @ManyToMany)對(duì)該超類(lèi)的字段和屬性進(jìn)行批注,但由于沒(méi)有針對(duì)該超類(lèi)本身的表存在,因此這些映射只適用于它的子類(lèi)。繼承的持久字段或?qū)傩詫儆谧宇?lèi)的表。 

          可以在子類(lèi)中使用@AttributeOverride或@AssociationOverride來(lái)覆蓋超類(lèi)的映射配置。 
          @MappedSuperclass沒(méi)有屬性。 

          Java代碼  收藏代碼
          1. //如何將Employee指定為映射超類(lèi)  
          2. @MappedSuperclass  
          3. public class Employee {  
          4.     @Id  
          5.     protected Integer empId;  
          6.   
          7.     @Version  
          8.     protected Integer version;  
          9.   
          10.     @ManyToOne  
          11.     @JoinColumn(name="ADDR")  
          12.     protected Address address;  
          13. }  
          14.   
          15. //如何在實(shí)體類(lèi)中使用@AttributeOverride以覆蓋超類(lèi)中設(shè)置的配置。  
          16. @Entity  
          17. @AttributeOverride(name="address", column=@Column(name="ADDR_ID"))  
          18. public class PartTimeEmployee extends Employee {  
          19.     @Column(name="WAGE")  
          20.     protected Float hourlyWage;  
          21. }  

              


          @PrimaryKeyJoinColumn 
          在三種情況下會(huì)用到@PrimaryKeyJoinColumn 
          • 繼承。
          • entity class映射到一個(gè)或多個(gè)從表。從表根據(jù)主表的主鍵列(列名為referencedColumnName值的列),建立一個(gè)類(lèi)型一樣的主鍵列,列名由name屬性定義。
          • one2one關(guān)系,關(guān)系維護(hù)端的主鍵作為外鍵指向關(guān)系被維護(hù)端的主鍵,不再新建一個(gè)外鍵列。

          屬性說(shuō)明: 
          • name:列名。
          • referencedColumnName:該列引用列的列名
          • columnDefinition:定義建表時(shí)創(chuàng)建此列的DDL

          下面的代碼說(shuō)明Customer映射到兩個(gè)表,主表CUSTOMER,從表CUST_DETAIL,從表需要建立主鍵列CUST_ID,該列和主表的主鍵列id除了列名不同,其他定義一樣。 

          Java代碼  收藏代碼
          1.    @Entity  
          2.    @Table(name="CUSTOMER")  
          3. @SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID",referencedColumnName="id"))  
          4.    public class Customer {   
          5.        @Id(generate = GeneratorType.AUTO)  
          6.        public Integer getId() {  
          7.     return id;  
          8. }  
          9.    }  

          下面的代碼說(shuō)明Employee和EmployeeInfo是一對(duì)一關(guān)系,Employee的主鍵列id作為外鍵指向EmployeeInfo的主鍵列INFO_ID。 
          Java代碼  收藏代碼
          1.             
          2.    @Table(name = "Employee")  
          3.    public class Employee {  
          4. @OneToOne  
          5. @PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")  
          6. EmployeeInfo info;  
          7.    }  
              
              

          @PrimaryKeyJoinColumns 
          如果entity class使用了復(fù)合主鍵,指定單個(gè)PrimaryKeyJoinColumn不能滿(mǎn)足要求時(shí),可以用PrimaryKeyJoinColumns來(lái)定義多個(gè)PrimaryKeyJoinColumn 
          屬性說(shuō)明: 
          • value: 一個(gè)PrimaryKeyJoinColumn數(shù)組,包含所有PrimaryKeyJoinColumn

          下面的代碼說(shuō)明了Employee和EmployeeInfo是一對(duì)一關(guān)系。他們都使用復(fù)合主鍵,建表時(shí)需要在Employee表建立一個(gè)外鍵,從Employee的主鍵列id,name指向EmployeeInfo的主鍵列INFO_ID和INFO_NAME 

          Java代碼  收藏代碼
          1.    @Entity  
          2.    @IdClass(EmpPK.class)  
          3.    @Table(name = "EMPLOYEE")  
          4.    public class Employee {  
          5. private int id;  
          6. private String name;  
          7. private String address;  
          8. @OneToOne(cascade = CascadeType.ALL)  
          9. @PrimaryKeyJoinColumns({  
          10. @PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),  
          11. @PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})  
          12. EmployeeInfo info;  
          13.    }  
          14.   
          15.   
          16.    @Entity  
          17.    @IdClass(EmpPK.class)  
          18.    @Table(name = "EMPLOYEE_INFO")  
          19.    public class EmployeeInfo {  
          20. @Id  
          21. @Column(name = "INFO_ID")  
          22. private int id;  
          23. @Id  
          24. @Column(name = "INFO_NAME")  
          25. private String name;  
          26.    }  



          @Transient 
          Transient用來(lái)注釋entity的屬性,指定的這些屬性不會(huì)被持久化,也不會(huì)為這些屬性建表 

          Java代碼  收藏代碼
          1. @Transient  
          2. private String name;  

              

          @Version 
          Version指定實(shí)體類(lèi)在樂(lè)觀事務(wù)中的version屬性。在實(shí)體類(lèi)重新由EntityManager管理并且加入到樂(lè)觀事務(wù)中時(shí),保證完整性。每一個(gè)類(lèi)只能有一個(gè)屬性被指定為version,version屬性應(yīng)該映射到實(shí)體類(lèi)的主表上。 
          屬性說(shuō)明: 
          • value: 一個(gè)PrimaryKeyJoinColumn數(shù)組,包含所有PrimaryKeyJoinColumn

          下面的代碼說(shuō)明versionNum屬性作為這個(gè)類(lèi)的version,映射到數(shù)據(jù)庫(kù)中主表的列名是OPTLOCK 

          Java代碼  收藏代碼
          1. @Version  
          2. @Column("OPTLOCK")  
          3. protected int getVersionNum() { return versionNum; }  




          @Lob 
          Lob指定一個(gè)屬性作為數(shù)據(jù)庫(kù)支持的大對(duì)象類(lèi)型在數(shù)據(jù)庫(kù)中存儲(chǔ)。使用LobType這個(gè)枚舉來(lái)定義Lob是二進(jìn)制類(lèi)型還是字符類(lèi)型。 
          LobType枚舉類(lèi)型說(shuō)明: 
          • BLOB 二進(jìn)制大對(duì)象,Byte[]或者Serializable的類(lèi)型可以指定為BLOB。
          • CLOB 字符型大對(duì)象,char[]、Character[]或String類(lèi)型可以指定為CLOB。

          屬性說(shuō)明: 
          • fetch:定義這個(gè)字段是lazy loaded還是eagerly fetched。數(shù)據(jù)類(lèi)型是FetchType枚舉,默認(rèn)為L(zhǎng)AZY,即lazy loaded.
          • type:定義這個(gè)字段在數(shù)據(jù)庫(kù)中的JDBC數(shù)據(jù)類(lèi)型。數(shù)據(jù)類(lèi)型是LobType枚舉,默認(rèn)為BLOB。

          下面的代碼定義了一個(gè)BLOB類(lèi)型的屬性和一個(gè)CLOB類(lèi)型的屬性 

          Java代碼  收藏代碼
          1. @Lob  
          2. @Column(name="PHOTO" columnDefinition="BLOB NOT NULL")  
          3. protected JPEGImage picture;  
          4.   
          5. @Lob(fetch=EAGER, type=CLOB)  
          6. @Column(name="REPORT")  
          7. protected String report;  
            
             

          @JoinTable 
          JoinTable在many-to-many關(guān)系的所有者一邊定義。如果沒(méi)有定義JoinTable,使用JoinTable的默認(rèn)值。 
          屬性說(shuō)明: 
          • table:這個(gè)join table的Table定義。
          • joinColumns:定義指向所有者主表的外鍵列,數(shù)據(jù)類(lèi)型是JoinColumn數(shù)組。
          • inverseJoinColumns:定義指向非所有者主表的外鍵列,數(shù)據(jù)類(lèi)型是JoinColumn數(shù)組。

          下面的代碼定義了一個(gè)連接表CUST和PHONE的join table。join table的表名是CUST_PHONE,包含兩個(gè)外鍵,一個(gè)外鍵是CUST_ID,指向表CUST的主鍵ID,另一個(gè)外鍵是PHONE_ID,指向表PHONE的主鍵ID。 

          Java代碼  收藏代碼
          1. @JoinTable(  
          2. table=@Table(name=CUST_PHONE),  
          3. joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),  
          4. inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")  
          5. )  



          @TableGenerator 
          TableGenerator定義一個(gè)主鍵值生成器,在Id這個(gè)元數(shù)據(jù)的generate=TABLE時(shí),generator屬性中可以使用生成器的名字。生成器可以在類(lèi)、方法或者屬性上定義。 
          生成器是為多個(gè)實(shí)體類(lèi)提供連續(xù)的ID值的表,每一行為一個(gè)類(lèi)提供ID值,ID值通常是整數(shù)。 
          屬性說(shuō)明: 
          • name:生成器的唯一名字,可以被Id元數(shù)據(jù)使用。
          • table:生成器用來(lái)存儲(chǔ)id值的Table定義。
          • pkColumnName:生成器表的主鍵名稱(chēng)。
          • valueColumnName:生成器表的ID值的列名稱(chēng)。
          • pkColumnValue:生成器表中的一行數(shù)據(jù)的主鍵值。
          • initialValue:id值的初始值。
          • allocationSize:id值的增量。

          下面的代碼定義了兩個(gè)生成器empGen和addressGen,生成器的表是ID_GEN 

          Java代碼  收藏代碼
          1. @Entity  
          2. public class Employee {  
          3. ...  
          4. @TableGenerator(name="empGen",table=@Table(name="ID_GEN"),pkColumnName="GEN_KEY",  
          5.                 valueColumnName="GEN_VALUE",pkColumnValue="EMP_ID",allocationSize=1)  
          6. @Id(generate=TABLE, generator="empGen")  
          7. public int id;  
          8. ...  
          9. }  
          10.   
          11. @Entity  
          12. public class Address {  
          13. ...  
          14. @TableGenerator(name="addressGen",table=@Table(name="ID_GEN"),pkColumnValue="ADDR_ID")  
          15. @Id(generate=TABLE, generator="addressGen")  
          16. public int id;  
          17. ...  
          18. }  



          @SequenceGenerator 
          SequenceGenerator定義一個(gè)主鍵值生成器,在Id這個(gè)元數(shù)據(jù)的generator屬性中可以使用生成器的名字。生成器可以在類(lèi)、方法或者屬性上定義。生成器是數(shù)據(jù)庫(kù)支持的sequence對(duì)象。 
          屬性說(shuō)明: 
          • name:生成器的唯一名字,可以被Id元數(shù)據(jù)使用。
          • sequenceName:數(shù)據(jù)庫(kù)中,sequence對(duì)象的名稱(chēng)。如果不指定,會(huì)使用提供商指定的默認(rèn)名稱(chēng)。
          • initialValue:id值的初始值。
          • allocationSize:id值的增量。

          下面的代碼定義了一個(gè)使用提供商默認(rèn)名稱(chēng)的sequence生成器 

          Java代碼  收藏代碼
          1. @SequenceGenerator(name="EMP_SEQ", allocationSize=25)  

              

          @DiscriminatorColumn 
          DiscriminatorColumn定義在使用SINGLE_TABLE或JOINED繼承策略的表中區(qū)別不繼承層次的列 
          屬性說(shuō)明: 
          • name:column的名字。默認(rèn)值為T(mén)YPE。
          • columnDefinition:生成DDL的sql片斷。
          • length:String類(lèi)型的column的長(zhǎng)度,其他類(lèi)型使用默認(rèn)值10。

          下面的代碼定義了一個(gè)列名為DISC,長(zhǎng)度為20的String類(lèi)型的區(qū)別列 

          Java代碼  收藏代碼
          1. @Entity  
          2. @Table(name="CUST")  
          3. @Inheritance(strategy=SINGLE_TABLE,discriminatorType=STRING,discriminatorValue="CUSTOMER")  
          4. @DiscriminatorColumn(name="DISC", length=20)  
          5. public class Customer { ... }  




          @NamedQuery 
          在使用JPA持久化規(guī)范的應(yīng)用程序中,可以使用實(shí)體管理器動(dòng)態(tài)創(chuàng)建和執(zhí)行查詢(xún),也可以預(yù)定義查詢(xún)并在運(yùn)行時(shí)按名稱(chēng)執(zhí)行。 
          使用@NamedQuery創(chuàng)建與@Entity或@MappedSuperclass關(guān)聯(lián)的預(yù)定義查詢(xún),這些查詢(xún): 
          • 使用JPA查詢(xún)語(yǔ)言進(jìn)行基于任何基礎(chǔ)數(shù)據(jù)庫(kù)的可移植執(zhí)行
          • 經(jīng)常被使用
          • 比較復(fù)雜并且難于創(chuàng)建
          • 可以在不同實(shí)體之間共享
          • 只返回實(shí)體(從不返回標(biāo)量值),并只返回一個(gè)類(lèi)型的實(shí)體


          屬性說(shuō)明: 
          • query:(必須屬性)要指定查詢(xún),請(qǐng)將 query 設(shè)置為 JPA 查詢(xún)語(yǔ)言(作為 String)
          • hints:默認(rèn)值:空 QueryHint 數(shù)組。默認(rèn)情況下,JPA 持續(xù)性提供程序假設(shè) SQL 查詢(xún)應(yīng)完全按照 query 屬性提供的方式執(zhí)行。要微調(diào)查詢(xún)的執(zhí)行,可以選擇將hints設(shè)置為一個(gè)QueryHint數(shù)組(請(qǐng)參閱 @QueryHint)。在執(zhí)行時(shí),EntityManager 將向基礎(chǔ)數(shù)據(jù)庫(kù)傳遞提示。
          • name:(必須屬性)要指定查詢(xún)名稱(chēng),請(qǐng)將name設(shè)置為所需的String名稱(chēng)

          下面的代碼使用@NamedQuery批注定義一個(gè)JPA查詢(xún)語(yǔ)言查詢(xún),該查詢(xún)使用名為firstname的參數(shù) 

          Java代碼  收藏代碼
          1. //使用 @NamedQuery 實(shí)現(xiàn)一個(gè)帶參數(shù)的查詢(xún)  
          2. @Entity  
          3. @NamedQuery(name="findAllEmployeesByFirstName",  
          4.             query="SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = :firstname")  
          5. public class Employee implements Serializable {  
          6.      …  
          7. }  
          8.   
          9. //執(zhí)行命名查詢(xún)  
          10. Query queryEmployeesByFirstName = em.createNamedQuery(“findAllEmployeesByFirstName”);  
          11. queryEmployeeByFirstName.setParameter(“firstName”, “John”);  
          12. Collection employees = queryEmployessByFirstName.getResultList();  




          @NamedQueries 
          如果需要指定多個(gè)@NamedQuery,則必須使用一個(gè)@NamedQueries指定所有命名查詢(xún) 
          屬性說(shuō)明: 
          • value:要指定兩個(gè)或更多屬性覆蓋,請(qǐng)將value設(shè)置為NamedQuery實(shí)例數(shù)組


          Java代碼  收藏代碼
          1. @Entity  
          2. @NamedQueries({@NamedQuery(name="findAllEmployeesByFirstName",  
          3.                query="SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = :firstname"),  
          4.                @NamedQuery(name="findAllEmployeesByLasttName",  
          5.                query="SELECT OBJECT(emp) FROM Employee emp WHERE emp.lasstName = :lastname")})  
          6. public class PartTimeEmployee extends Employee {  
          7.   
          8. }  




          @NamedNativeQuery 
          使用@NamedNativeQuery創(chuàng)建與@Entity或@MappedSuperclass關(guān)聯(lián)的預(yù)定義查詢(xún),這些查詢(xún): 
          • 使用基礎(chǔ)數(shù)據(jù)庫(kù)的原生SQL
          • 經(jīng)常被使用
          • 比較復(fù)雜并且難于創(chuàng)建
          • 可以在不同實(shí)體之間共享
          • 返回實(shí)體、標(biāo)量值或兩者的組合(另請(qǐng)參閱 @ColumnResult、@EntityResult、@FieldResult 和@SqlResultSetMapping)

          屬性說(shuō)明: 
          • query:(必須屬性)要指定查詢(xún),請(qǐng)將query設(shè)置為SQL查詢(xún)(作為String)
          • hints:默認(rèn)值:空 QueryHint 數(shù)組。默認(rèn)情況下,JPA 持續(xù)性提供程序假設(shè) SQL 查詢(xún)應(yīng)完全按照 query 屬性提供的方式執(zhí)行。要微調(diào)查詢(xún)的執(zhí)行,可以選擇將hints設(shè)置為一個(gè)QueryHint數(shù)組(請(qǐng)參閱 @QueryHint)。在執(zhí)行時(shí),EntityManager 將向基礎(chǔ)數(shù)據(jù)庫(kù)傳遞提示。
          • name:(必須屬性)要指定查詢(xún)名稱(chēng),請(qǐng)將name設(shè)置為所需的String名稱(chēng)
          • resultClass:默認(rèn)值:JPA 持續(xù)性提供程序假設(shè)結(jié)果類(lèi)是關(guān)聯(lián)實(shí)體的Class.要指定結(jié)果類(lèi),請(qǐng)將resultClass設(shè)置為所需的 Class
          • resultSetMapping:默認(rèn)值:JPA持續(xù)性提供程序假設(shè)原生SQL查詢(xún)中的SELECT語(yǔ)句:返回一個(gè)類(lèi)型的實(shí)體;包括與返回的實(shí)體的所有字段或?qū)傩韵鄬?duì)應(yīng)的所有列;并使用與字段或?qū)傩悦Q(chēng)(未使用AS語(yǔ)句)相對(duì)應(yīng)的列名。要控制JPA持續(xù)性提供程序如何將JDBC結(jié)果集映射到實(shí)體字段或?qū)傩砸约皹?biāo)量,請(qǐng)通過(guò)將resultSetMapping設(shè)置為所需的@SqlResultSetMapping的String名稱(chēng)來(lái)指定結(jié)果集映射


          Java代碼  收藏代碼
          1. //定義一個(gè)使用基礎(chǔ)數(shù)據(jù)庫(kù)的原生SQL的查詢(xún)  
          2. @Entity  
          3. @NamedNativeQuery(name="findAllEmployees",query="SELECT * FROM EMPLOYEE")  
          4. public class Employee implements Serializable {  
          5.   
          6. }  
          7.   
          8. //Hibernate如何使用EntityManager獲取此查詢(xún)以及如何通過(guò)Query方法getResultList執(zhí)行該查詢(xún)  
          9. Query queryEmployees = em.createNamedQuery("findAllEmployees");  
          10. Collection employees = queryEmployees.getResultList();  



          @NamedNativeQueries 
          如果需要指定多個(gè)@NamedNativeQuery,則必須使用一個(gè)@NamedNativeQueries指定所有命名查詢(xún) 
          屬性說(shuō)明: 
          • value:要指定兩個(gè)或更多屬性覆蓋,請(qǐng)將value設(shè)置為NamedNativeQuery實(shí)例數(shù)組

          下面代碼顯示了如何使用此批注指定兩個(gè)命名原生查詢(xún) 

          Java代碼  收藏代碼
          1. @Entity  
          2. @NamedNativeQueries({@NamedNativeQuery(name="findAllPartTimeEmployees",  
          3.                      query="SELECT * FROM EMPLOYEE WHERE PRT_TIME=1"),  
          4.                      @NamedNativeQuery(name="findAllSeasonalEmployees,  
          5.                      query="SELECT * FROM EMPLOYEE WHERE SEASON=1")})  
          6.   
          7. public class PartTimeEmployee extends Employee {  
          8.   
          9. }  




          @OneToMany和@ManyToOne 
          屬性說(shuō)明: 
          cascade默認(rèn)值CascadeType的空數(shù)組。默認(rèn)情況下,JPA不會(huì)將任何持久化操作層疊到關(guān)聯(lián)的目標(biāo)。如果希望某些或所有持久化操作層疊到關(guān)聯(lián)的目標(biāo),應(yīng)將cascade設(shè)置為一個(gè)或多個(gè) CascadeType類(lèi)型的枚舉值,其中包括:● ALL – 針對(duì)擁有實(shí)體執(zhí)行的任何持久化操作均層疊到關(guān)聯(lián)的目標(biāo)。● MERGE – 如果合并了擁有實(shí)體,則將merge層疊到關(guān)聯(lián)的目標(biāo)。● PERSIST – 如果持久保存擁有實(shí)體,則將persist層疊到關(guān)聯(lián)的目標(biāo)。● REFRESH – 如果刷新了擁有實(shí)體,則refresh為關(guān)聯(lián)的層疊目標(biāo)。● REMOVE – 如果刪除了擁有實(shí)體,則還刪除關(guān)聯(lián)的目標(biāo)。
          fetch在Hibernate里用時(shí)默認(rèn)值:FetchType.LAZY,它要求程序運(yùn)行時(shí)延遲加載所有的集合和實(shí)體。如果這不適合于應(yīng)用程序或特定的持久字段,將fetch設(shè)置為FetchType.EAGER,它提示程序在首次訪問(wèn)數(shù)據(jù)時(shí)應(yīng)馬上加載所有的集合和實(shí)體
          mappedBy默認(rèn)值:如果關(guān)系是單向的,則該關(guān)聯(lián)提供程序確定擁有該關(guān)系的字段。如果關(guān)系是雙向的,則將關(guān)聯(lián)相反(非擁有)方上的mappedBy元素設(shè)置為擁有此關(guān)系的字段或?qū)傩缘拿Q(chēng)
          targetEntity默認(rèn)值:使用一般參數(shù)定義的Collection的參數(shù)化類(lèi)型。默認(rèn)情況下,如果使用通過(guò)一般參數(shù)定義的Collection,則程序?qū)谋灰玫膶?duì)象類(lèi)型推斷出關(guān)聯(lián)的目標(biāo)實(shí)體。如果Collection不使用一般參數(shù),則必須指定作為關(guān)聯(lián)目標(biāo)的實(shí)體類(lèi):將關(guān)聯(lián)擁有方上的 targetEntity元素設(shè)置為作為關(guān)系目標(biāo)的實(shí)體的Class




          @OneToOne 
          屬性比@OneToMany多一個(gè): 
          optionalde默認(rèn)值:true。默認(rèn)情況下,JPA持久化程序假設(shè)所有(非基元)字段和屬性的值可以為空。如果這并不適合于您的應(yīng)用程序,請(qǐng)將optional設(shè)置為false




          @OrderBy 
          一般將@OrderBy與@OneToMany和@ManyToMany一起使用 
          在一對(duì)多,多對(duì)多關(guān)系中,有時(shí)我們希望從數(shù)據(jù)庫(kù)加載出來(lái)的集合對(duì)象是按一定方式排序的,這可以通過(guò)OrderBy來(lái)實(shí)現(xiàn),默認(rèn)是按對(duì)象的主鍵升序排列。 
          屬性說(shuō)明: 
          • value:字符串類(lèi)型,指定排序方式。格式為"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......" 
            排序類(lèi)型可以不指定,默認(rèn)是ASC升序。 

          下面的代碼說(shuō)明Person和Book之間是一對(duì)多關(guān)系。集合books按照Book的isbn升序,name降序排列。

          Java代碼  收藏代碼
          1. @Table(name = "MAPKEY_PERSON")  
          2. public class Person {  
          3.      @OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")  
          4.      @OrderBy(name = "isbn ASC, name DESC")  
          5.      private List books = new ArrayList();  
          6. }  
          7.   
          8.   
          9. @Entity   
          10. public class Project {  
          11.      @ManyToMany  
          12.      @OrderBy("lastname ASC", "seniority DESC")  
          13.      public List<Employee> getEmployees() {  
          14.           …  
          15.      }  
          16. }  
          17.   
          18.   
          19. @Entity   
          20. public class Employee {  
          21.      @Id  
          22.      private int empId;  
          23.   
          24.      private String lastname;  
          25.   
          26.      private int seniority;  
          27.   
          28.      @ManyToMany(mappedBy="employees")  
          29.      // By default, returns a List in ascending order by empId  
          30.      public List<Project> getProjects() {  
          31.          …  
          32.      }  
          33. }  
          posted on 2014-10-29 14:15 fly 閱讀(1964) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): J2EE
          主站蜘蛛池模板: 城市| 南投市| 五家渠市| 宣城市| 仲巴县| 德昌县| 连州市| 连江县| 绥江县| 新竹市| 晋江市| 金溪县| 公安县| 亳州市| 灯塔市| 湘阴县| 潜山县| 义马市| 五河县| 乌鲁木齐市| 葫芦岛市| 疏勒县| 商城县| 原平市| 南部县| 亳州市| 甘孜县| 五大连池市| 东丽区| 登封市| 习水县| 出国| 白山市| 开封县| 古丈县| 仁寿县| 蕉岭县| 汉川市| 郑州市| 青州市| 苏尼特左旗|