登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

赵训勇的博客

 
 
 

日志

 
 

JPA(一)  

2010-07-02 22:50:08|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、   映射实体:

@Entity(name="Customer")//Customer:实体的名称select c from Customer c

@Table(schema="db",uniqueConstraints={

       //唯一鍵

       @UniqueConstraint(

              columnNames = {"CUSTOMER_NAME"}

       )/*,@UniqueConstraint(

              columnNames = {"NAME","SHORTNAME"}

       )*/

})//CUSTOMER:表名,catalog:目录名,schema:数据库

二、   映射ID

1.       Sequence生成器:

    @Id

    @GeneratedValue(

           strategy=GenerationType.SEQUENCE,

           generator="myseq"

    )

    @SequenceGenerator(

           name="myseq",

           sequenceName="id_seq"//,initialValue=1,allocationSize=1

    )

/*@Id @GeneratedValue(generator = "myseq")

        @org.hibernate.annotations.GenericGenerator(

           name = "myseq",

           parameters = {

@org.hibernate.annotations.Parameter(

name="sequence",value="id_seq"

)},

           strategy = "sequence"

    )*/

2.       表生成器:

    @GeneratedValue(

           strategy=GenerationType.TABLE,

           generator="myseq"

    )

    @TableGenerator(

           name="myseq",

           table="tb_seq",

           pkColumnName="gen_name",//栏位名

           valueColumnName="gen_value",//栏位名

           pkColumnValue="pk_tb_seq",//栏位值

           allocationSize=1//,UniqueConstraintTable一样

    )

3.       复合主鍵:

@Embeddable

public class CustomerPK implements java.io.Serializable{

      private String name;

  private String email;

 

public class Customer implements java.io.Serializable {

    @EmbeddedId

private CustomerPK pk;

 

//@Embeddable(第一种方式)

public class SCId implements Serializable {

    private Long sno; // 学号

private Long cno; // 课程号

 

    @Id//(第一种方式) 此方式SC.java中需@Embeddable

    @AttributeOverrides({

       @AttributeOverride(name="sno",column=@Column(name="SNO")),

       @AttributeOverride(name="cno",column=@Column(name="CNO"))

    })

    @EmbeddedId//此方式SC.java中无需@Embeddable(第二种方式)

    @AttributeOverrides({

       @AttributeOverride(name="sno",column=@Column(name="SNO")),

       @AttributeOverride(name="cno",column=@Column(name="CNO"))

    })

    //@Transient(映射非持久化类型)

private SCId scid;

 

<!-- <composite-id name="scid" class="SCId"> -->

        <composite-id>

            <key-property name="sno" type="long">

                <column name="Sno" />

            </key-property>

            <key-property name="cno" type="long">

                <column name="Cno" />

            </key-property>

     </composite-id>

三、   映射方法与属性:

@Basic(fetch=FetchType.EAGER,optional=false)//LAZY:延时加载,EAGER:即时加载(default EAGER),optional表示属性是否可为空default true

@Temporal(TemporalType.DATE)//default java.sql.TIMESTAMP Temporal@转换成java.util.Date

@Column(

           name="CUSTOMER_NAME",

           //unique=true,//是否唯一

           //nullable=false,//是否为空

           //insertable=false,//是否允许insert

           //updatable=false,//是否允许update

           //columnDefinition="varchar2(200) not null",

           length=512//precision=12,scale=2,精度为12,小数倍数为2

)

四、   映射枚举:

@Enumerated(EnumType.ORDINAL)//EnumType.STRING

private CustomerType types;

public enum CustomerType {

    COMPETITOR,INVESTOR,PARTNER,VENDER

}

五、   一对一:

1.       共享主鍵:

User.java:

@OneToOne

    @PrimaryKeyJoinColumn

    @org.hibernate.annotations.Cascade(

           value = org.hibernate.annotations.CascadeType.SAVE_UPDATE

    )

private Address address;

<class name="User" table="USER">

         <id name="id" type="long" column="USER_ID">

        <generator class="sequence">

              <param name="sequence">id_seq</param>

       </generator>

         </id>

         <property name="loginName"/>

         <property name="admin" type="yes_no"/>

        <one-to-one name="address" class="Address" cascade="save-update"/>

</class>

Address.java:

@Id @GeneratedValue(generator = "myForeignGenerator")

@org.hibernate.annotations.GenericGenerator(

        name = "myForeignGenerator",

        strategy = "foreign",

        parameters = @org.hibernate.annotations.Parameter(name = "property",value = "user")

)

@Column(name = "ADDRESS_ID")

private Long id;

@OneToOne

    @PrimaryKeyJoinColumn

private User user;

<class name="Address" table="ADDRESS">

         <id name="id" type="long" column="ADDRESS_ID">

        <generator class="foreign">

              <param name="property">user</param>

       </generator>

         </id>

         <property name="street"/>

         <property name="city"/>

         <property name="zipcode"/> 

         <one-to-one name="user" class="User" constrained="true"/>  

</class>

必须设置双向关系:

User user = new User("F1605818","赵训勇","5818");

       Address address = new Address("sz","518109");

       user.setAddress(address);

       address.setUser(user);

em.persist(user);

查询时:left outer join

2.       外鍵关联:

User_A.java:

@OneToOne(

           targetEntity=Address.class,//可以省略

           cascade={CascadeType.ALL},

           fetch=FetchType.LAZY,

           optional=false//,该实体不能为空,

           //mappedBy=""

    )

    @JoinColumn(

           name=" ADDRESS_ID",//default 关联表名称+"_"+关联主鍵的字段名

           referencedColumnName="ID",//默认为主鍵

           nullable=false,

           updatable=false

)

@org.hibernate.annotations.Cascade(

           value = org.hibernate.annotations.CascadeType.SAVE_UPDATE

)

private Address_A address;

 

<many-to-one name="address" class="Address_A"

        column="ADDRESS_ID" cascade="save-update" unique="true"/>

 

Address_A.java:

@OneToOne(mappedBy="address")

private User_A user;

 

<one-to-one name="user" class="User_A" property-ref="address"/>

3.       表关联:

@SecondaryTable(name = "CUSTOMER_ADDRESS")

public class AddressEO implements java.io.Serializable {

...

@ManyToOne(cascade={CascadeType.ALL})

@JoinColumn(table = "CUSTOMER_ADDRESS",name = "USER_ID")

private CustomerEO customer;

<join table="CUSTOMER_ADDRESS" optional="true" inverse="true">

         <key column="ADDRESS_ID" unique="true" not-null="true"/>

     <many-to-one name="customer" column="CUSTOMER_ID" not-null="true" unique="true"/>

</join>

六、   一对多:

1.       外鍵关联:

Teacher.java:

@OneToMany(targetEntity=st1.Student.class,mappedBy = "teacher")

        @JoinColumn(name = "TEACHER_ID",nullable = false)

private Set students = new HashSet();

<set name="students" inverse="true" lazy="false" fetch="select" batch-size="4">

            <key>

                <column name="TEACHER_ID" precision="22" scale="0" />

            </key>

            <one-to-many class="Student" />

</set>

 

@OneToMany(targetEntity=st1.Student.class,mappedBy = "teacher")

@org.hibernate.annotations.IndexColumn(name=”POSITION”)

        @JoinColumn(name = "TEACHER_ID",nullable = false)

private List students = new ArrayList();

<list name="students" inverse="true" lazy="false" fetch="select" batch-size="4">

            <key column name="TEACHER_ID" not-null=”true” />

           <list-index column=”POSITION”/>

            <one-to-many class="Student" />

</list>

 

        @MapKey(name = "id")

        @OneToMany(mappedBy = "item")

        @JoinColumn(name = "ITEM_ID",nullable = false)

        @org.hibernate.annotations.Cascade(

           value = org.hibernate.annotations.CascadeType.SAVE_UPDATE

        )  

private Map<Long,Bid> bids = new HashMap<Long,Bid>();

<map name="bids" inverse="true">

        <key column="ITEM_ID"/>

        <!-- formula使变成只读,从不更新此栏位 -->

        <map-key type="long" formula="ID"/>

        <one-to-many class="Bid"/>

</map>

2.       表关联:

@OneToMany(cascade={CascadeType.ALL})

        @JoinTable(

           name=”CUSTOMER_ADDRESS”,

           joinColumns={

                  @JoinColumn(name="customer_id",referencedColumnName="id")

           },

           inverseJoinColumns={

                  @JoinColumn(name="address_id",referencedColumnName="id")

           }

        )  

    private Set<AddressEO> address = new HashSet<AddressEO>();

<set name="address" table="CUSTOMER_ADDRESS" cascade="save-update">

         <key column="USER_ID"/>

         <many-to-many class="Address" column="ADDRESS_ID" unique="true"/>

    </set>

3.  映射自身父子关系:

@Entity

public class Category implements Serializable {

    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE)

    private Long id;

    private String name;

    @ManyToOne(

           targetEntity = Category.class

    )

    @org.hibernate.annotations.Cascade(

           value = org.hibernate.annotations.CascadeType.SAVE_UPDATE

    )

    private Category parentCategory;

    @OneToMany(

           targetEntity = Category.class,

           mappedBy = "childCategories"//相当于inverse="true"

    )

    @org.hibernate.annotations.Cascade(

           value = org.hibernate.annotations.CascadeType.SAVE_UPDATE

    )

private Set childCategories;

    <set name="childCategories" cascade="save-update" inverse="true">

        <key column="CATEGORY_ID" />

        <one-to-many class="Category" />

     </set>

     <many-to-one name="parentCategory" column="CATEGORY_ID" class="Category"/>

七、   多对一:

1.       外鍵关联:

Student.java:

@ManyToOne(targetEntity = st1.Teacher.class)

        @org.hibernate.annotations.Cascade(

           value = org.hibernate.annotations.CascadeType.SAVE_UPDATE

        )

        @JoinColumn(name = "TEACHER_ID",nullable =false)

private Teacher teacher;

<many-to-one name="teacher" class="Teacher" cascade="save-update">

            <column name="TEACHER_ID" precision="22" scale="0" />

</many-to-one>

 

//映射非主鍵

@JoinColumn(name = "SELLER_NR",referencedColumnName = "CUSTOMER_NR")

<many-to-one name="seller" column="SELLER_NR" property-ref="customerNr"/>

2.       表关联:

@SecondaryTable(name = "CUSTOMER_ADDRESS")

public class AddressEO implements java.io.Serializable {

...

@ManyToOne(cascade={CascadeType.ALL})

@JoinColumn(table = "CUSTOMER_ADDRESS",name = "USER_ID")

private CustomerEO customer;

<join table="CUSTOMER_ADDRESS" optional="true" inverse="true">

         <key column="ADDRESS_ID" unique="true" not-null="true"/>

         <many-to-one name="customer" column="CUSTOMER_ID"/>

</join>

3.  联结表映射到组件的集合

@Entity

public class Category {

    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE)

    private Long id;

    private String name;

    @org.hibernate.annotations.CollectionOfElements

    @JoinTable(

           name = "CATEGORY_ITEM",

           joinColumns = @JoinColumn(name = "CATEGORY_ID")

    )

private Set<CategorizedItem> categorizedItems = new HashSet<CategorizedItem>();

 

@Embeddable

public class CategorizedItem {

    @Column(name = "ADDED_BY_USER")

    private String username;

    @Temporal(TemporalType.TIMESTAMP)

    @Column(name = "ADDED_ON",nullable=false,updatable=false)

    private Date dateAdded = new Date();

    @org.hibernate.annotations.Parent

    private Category category;

    @ManyToOne

    @JoinColumn(name = "ITEM_ID",nullable=false,updatable=false)

    private Item item;

   <class name="Category" table="CATEGORY">

      <id name="id" type="long" column="ID">

        <generator class="sequence">

              <param name="sequence">id_seq</param>

       </generator>

      </id>

      <property name="name"/>

      <set name="categorizedItems" table="CATEGORY_ITEM">

         <key column="CATEGORY_ID"/>

         <composite-element class="CategorizedItem">

            <parent name="category"/>

            <many-to-one name="item" column="ITEM_ID" not-null="true" class="Item"/>

            <!-- <many-to-one name="user" column="USER_ID" not-null="true" class="User"/> -->

            <property name="username" column="ADDED_BY_USER"/>

            <property name="dateAdded" column="ADDED_ON"/>

         </composite-element>

      </set>     

</class>

  评论这张
 
阅读(779)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018