<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    我收藏的一些文章!

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    @Table 
    Table用來定義entity主表的name,catalog,schema等屬性。 
    屬性說明: 

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


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



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

    下面的代碼說明Customer類映射到兩個(gè)表,主表名是CUSTOMER,從表名是CUST_DETAIL,從表的主鍵列和主表的主鍵列類型相同,列名為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來定義各個(gè)從表的屬性。 
    屬性說明: 
    • 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ù)里,用來指定建表時(shí)需要建唯一約束的列。 
    屬性說明: 
    • 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ù)庫的列的所有屬性:列名,是否唯一,是否允許為空,是否允許更新等。 
    屬性說明: 
    • 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等),我們通過JoinColumn來定義關(guān)系的屬性。JoinColumn的大部分屬性和Column類似。 
    屬性說明: 
    • unique:是否唯一
    • referencedColumnName:該列指向列的列名(建表時(shí)該列作為外鍵列指向關(guān)系另一端的指定列)
    • nullable:是否允許為空
    • insertable:是否允許插入
    • updatable:是否允許更新
    • columnDefinition:定義建表時(shí)創(chuàng)建此列的DDL
    • secondaryTable:從表名。如果此列不建在主表上(默認(rèn)建在主表),該屬性定義該列所在從表的名字。

    下面的代碼說明Custom和Order是一對一關(guān)系。在Order對應(yīng)的映射表建一個(gè)名為CUST_ID的列,該列作為外鍵指向Custom對應(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的屬性。 
    屬性說明: 
    • value:定義JoinColumn數(shù)組,指定每個(gè)JoinColumn的屬性。

    下面的代碼說明Custom和Order是一對一關(guān)系。在Order對應(yīng)的映射表建兩列,一列名為CUST_ID,該列作為外鍵指向Custom對應(yīng)表中名為ID的列,另一列名為CUST_NAME,該列作為外鍵指向Custom對應(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ù)庫都可以指定為AUTO,我們會根據(jù)不同數(shù)據(jù)庫做轉(zhuǎn)換。NONE(默認(rèn))需要用戶自己指定Id的值。
    屬性說明: 
    • generate:主鍵值的獲取類型
    • generator:TableGenerator的名字(當(dāng)generate=GeneratorType.TABLE才需要指定該屬性)

    下面的代碼聲明Task的主鍵列id是自動增長的。(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è)類作為id class。id class必須符合以下要求:類必須聲明為public,并提供一個(gè)聲明為public的空構(gòu)造函數(shù)。必須實(shí)現(xiàn)Serializable接,覆寫equals()和hashCode()方法。entity class的所有id field在id class都要定義,且類型一樣。 
    屬性說明: 
    • value:id class的類名

    下面的代碼聲明Task的主鍵列id是自動增長的。(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 
    在一對多,多對多關(guān)系中,我們可以用Map來保存集合對象。默認(rèn)用主鍵值做key,如果使用復(fù)合主鍵,則用id class的實(shí)例做key,如果指定了name屬性,就用指定的field的值做key。 
    屬性說明: 
    • name:用來做key的field名字

    下面的代碼說明Person和Book之間是一對多關(guān)系。Person的books字段是Map類型,用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í)體類從中繼承持久字段的超類。當(dāng)多個(gè)實(shí)體類共享通用的持久字段或?qū)傩詴r(shí),這將是一個(gè)方便的模式。 

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

    可以在子類中使用@AttributeOverride或@AssociationOverride來覆蓋超類的映射配置。 
    @MappedSuperclass沒有屬性。 

    Java代碼  收藏代碼
    1. //如何將Employee指定為映射超類  
    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í)體類中使用@AttributeOverride以覆蓋超類中設(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 
    在三種情況下會用到@PrimaryKeyJoinColumn 
    • 繼承。
    • entity class映射到一個(gè)或多個(gè)從表。從表根據(jù)主表的主鍵列(列名為referencedColumnName值的列),建立一個(gè)類型一樣的主鍵列,列名由name屬性定義。
    • one2one關(guān)系,關(guān)系維護(hù)端的主鍵作為外鍵指向關(guān)系被維護(hù)端的主鍵,不再新建一個(gè)外鍵列。

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

    下面的代碼說明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.    }  

    下面的代碼說明Employee和EmployeeInfo是一對一關(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不能滿足要求時(shí),可以用PrimaryKeyJoinColumns來定義多個(gè)PrimaryKeyJoinColumn 
    屬性說明: 
    • value: 一個(gè)PrimaryKeyJoinColumn數(shù)組,包含所有PrimaryKeyJoinColumn

    下面的代碼說明了Employee和EmployeeInfo是一對一關(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用來注釋entity的屬性,指定的這些屬性不會被持久化,也不會為這些屬性建表 

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

        

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

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

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




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

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

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

    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)系的所有者一邊定義。如果沒有定義JoinTable,使用JoinTable的默認(rèn)值。 
    屬性說明: 
    • table:這個(gè)join table的Table定義。
    • joinColumns:定義指向所有者主表的外鍵列,數(shù)據(jù)類型是JoinColumn數(shù)組。
    • inverseJoinColumns:定義指向非所有者主表的外鍵列,數(shù)據(jù)類型是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屬性中可以使用生成器的名字。生成器可以在類、方法或者屬性上定義。 
    生成器是為多個(gè)實(shí)體類提供連續(xù)的ID值的表,每一行為一個(gè)類提供ID值,ID值通常是整數(shù)。 
    屬性說明: 
    • name:生成器的唯一名字,可以被Id元數(shù)據(jù)使用。
    • table:生成器用來存儲id值的Table定義。
    • pkColumnName:生成器表的主鍵名稱。
    • valueColumnName:生成器表的ID值的列名稱。
    • 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屬性中可以使用生成器的名字。生成器可以在類、方法或者屬性上定義。生成器是數(shù)據(jù)庫支持的sequence對象。 
    屬性說明: 
    • name:生成器的唯一名字,可以被Id元數(shù)據(jù)使用。
    • sequenceName:數(shù)據(jù)庫中,sequence對象的名稱。如果不指定,會使用提供商指定的默認(rèn)名稱。
    • initialValue:id值的初始值。
    • allocationSize:id值的增量。

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

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

        

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

    下面的代碼定義了一個(gè)列名為DISC,長度為20的String類型的區(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í)體管理器動態(tài)創(chuàng)建和執(zhí)行查詢,也可以預(yù)定義查詢并在運(yùn)行時(shí)按名稱執(zhí)行。 
    使用@NamedQuery創(chuàng)建與@Entity或@MappedSuperclass關(guān)聯(lián)的預(yù)定義查詢,這些查詢: 
    • 使用JPA查詢語言進(jìn)行基于任何基礎(chǔ)數(shù)據(jù)庫的可移植執(zhí)行
    • 經(jīng)常被使用
    • 比較復(fù)雜并且難于創(chuàng)建
    • 可以在不同實(shí)體之間共享
    • 只返回實(shí)體(從不返回標(biāo)量值),并只返回一個(gè)類型的實(shí)體


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

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

    Java代碼  收藏代碼
    1. //使用 @NamedQuery 實(shí)現(xiàn)一個(gè)帶參數(shù)的查詢  
    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í)行命名查詢  
    10. Query queryEmployeesByFirstName = em.createNamedQuery(“findAllEmployeesByFirstName”);  
    11. queryEmployeeByFirstName.setParameter(“firstName”, “John”);  
    12. Collection employees = queryEmployessByFirstName.getResultList();  




    @NamedQueries 
    如果需要指定多個(gè)@NamedQuery,則必須使用一個(gè)@NamedQueries指定所有命名查詢 
    屬性說明: 
    • value:要指定兩個(gè)或更多屬性覆蓋,請將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ù)定義查詢,這些查詢: 
    • 使用基礎(chǔ)數(shù)據(jù)庫的原生SQL
    • 經(jīng)常被使用
    • 比較復(fù)雜并且難于創(chuàng)建
    • 可以在不同實(shí)體之間共享
    • 返回實(shí)體、標(biāo)量值或兩者的組合(另請參閱 @ColumnResult、@EntityResult、@FieldResult 和@SqlResultSetMapping)

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


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



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

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

    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 
    屬性說明: 
    cascade默認(rèn)值CascadeType的空數(shù)組。默認(rèn)情況下,JPA不會將任何持久化操作層疊到關(guān)聯(lián)的目標(biāo)。如果希望某些或所有持久化操作層疊到關(guān)聯(lián)的目標(biāo),應(yīng)將cascade設(shè)置為一個(gè)或多個(gè) CascadeType類型的枚舉值,其中包括:● ALL – 針對擁有實(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,它提示程序在首次訪問數(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
    targetEntity默認(rèn)值:使用一般參數(shù)定義的Collection的參數(shù)化類型。默認(rèn)情況下,如果使用通過一般參數(shù)定義的Collection,則程序?qū)谋灰玫膶ο箢愋屯茢喑鲫P(guān)聯(lián)的目標(biāo)實(shí)體。如果Collection不使用一般參數(shù),則必須指定作為關(guān)聯(lián)目標(biāo)的實(shí)體類:將關(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)用程序,請將optional設(shè)置為false




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

    下面的代碼說明Person和Book之間是一對多關(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 閱讀(1958) 評論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 国产精品久久久久久亚洲小说| 99久久综合国产精品免费| 亚洲精品无码永久在线观看| 亚洲人成电影网站久久| 99re在线精品视频免费| 国产亚洲精品无码成人| 久久九九免费高清视频| 亚洲色图综合在线| 美女被免费网站视频在线| 成年人免费视频观看| 亚洲国产精品久久久久秋霞影院 | 亚洲午夜精品一区二区| 亚洲视频免费在线看| 男的把j放进女人下面视频免费| 亚洲无线一二三四区手机| 国产99久久亚洲综合精品| 日韩免费毛片视频| 一本天堂ⅴ无码亚洲道久久| 中文字幕免费不卡二区| 亚洲色精品88色婷婷七月丁香| 一级看片免费视频囗交| 亚洲男人天堂2020| 一级一级毛片免费播放| 亚洲国产一区二区三区| 一本大道一卡二大卡三卡免费| 亚洲JIZZJIZZ中国少妇中文| 污污视频网站免费观看| av免费不卡国产观看| 亚洲国产精品综合久久网各| 最刺激黄a大片免费网站| 日韩亚洲变态另类中文| 在线免费视频你懂的| 自拍偷自拍亚洲精品情侣| 青青操免费在线视频| 人人狠狠综合久久亚洲婷婷| 免费人成视频在线播放| 亚洲精品国产精品国自产观看| 国产精品无码免费专区午夜| 国产一级淫片免费播放电影| 羞羞漫画页面免费入口欢迎你 | 中国极品美軳免费观看|