posts - 3,  comments - 12,  trackbacks - 0
          轉自:http://blog.sina.com.cn/s/blog_4e17efaf0100eryx.html

          任務分兩天完成:(一人對多本書)
          第一天:
            hbm:這種配置方法是以前用到的配置方法,比較熟悉。
            問題---mysql的序列生成的各種方法還待明天查
           
          Annotation:第一次用到注釋去寫hibernate的映射,做了一下午
               由于jar包不齊,弄了很久
                  --->核心jar包:ejb3-persistence.jar
                  hibernate-annotations.jar
                  hibernate-commons-annotations.jar
               hibernate.cfg.xml:
               加載映射時不是加載映射文件而是映射到實體類
               <mapping class="com.yeepay.entity.Person"/>
               工具類得到SessionFactory:
                     seesionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
               標簽:1).寫在類定義上
                     @Entity    //表明是實體類
          @Table(name="person_db")   //映射到的表名
          2).主鍵修飾
          @Id @GeneratedValue(strategy = GenerationType.AUTO)-----表中  auto_increment
                     @Column(name = "id") // 數據庫id
                     表示是主鍵,并且對應增長形勢,對應表列
          1) IDENTITY:表自增鍵字段,Oracle不支持這種方式;
          2) AUTO: JPA自動選擇合適的策略,是默認選項; ===auto_increment
          3) SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator注解指定序列名,MySql不支持這種方式;
          4) TABLE:通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易于數據庫移植
                     3).普通屬性
                     @Column(name = "name") // 名字
                     直接在某一屬性上寫,表示此屬性對應表的列
                     4).關系屬性
                     @OneToMany(cascade = CascadeType.ALL, mappedBy = "person", fetch = FetchType.EAGER)
                     mappedBy="school"就相當于inverse=true,(mappedBy指定的是不需要維護關系的一端)
                     關系屬性上,表示是OneToMany
                     cascade級聯關系   mappedBy對應類中的自己的應用屬性名  fetch懶加載(eager lazy)
                     @ManyToOne (optional=true, fetch = FetchType.EAGER)  
          @JoinColumn(name="person_id", nullable=true, insertable = false, updatable = false)
          關系屬性上,表示是ManyToOne
          name表示對應表內字段  
          注:必須是所謂的雙向關系,不然報 沒有序列化異常
          第二天:
              1.mysql的序列生成
                    auto_increment 自動增長
                    uuid()函數   適用于并發,但是效率不高,且占磁盤。(UUID的內容是字符串的)
              2.@Id  
                @GeneratedValue(generator = "system-uuid")  
                @GenericGenerator(name = "system-uuid", strategy = "uuid")    -----表中id沒有主鍵生成
              3.特殊@Formula("select COUNT(*) from school_info")  
                    private int count; 
              4.關系修飾
              @OneToOne注釋指明Person 與IDCard為一對一關系,@OneToOne注釋五個屬性:targetEntity、cascade、fetch、optional 和mappedBy, 
               *optional = true設置idcard屬性可以為null。
               *targetEntity屬性:Class類型的屬性。定義關系類的類型,默認是該成員屬性對應的類類型,所以通常不需要提供定義。 
               *cascade屬性:CascadeType[]類型。該屬性定義類和類之間的級聯關系。定義的級聯關系將被容器視為對當前類對象及其關聯類對象采取相同的操作, 
               *而且這種關系是遞歸調用的。cascade的值只能從CascadeType.PERSIST(級聯新建)、CascadeType.REMOVE(級聯刪除)、 
               *CascadeType.REFRESH(級聯刷新)、CascadeType.MERGE(級聯更新)中選擇一個或多個。還有一個選擇是使用CascadeType.ALL,表示選擇全部四項。 
              
               *fetch屬性:FetchType類型的屬性。可選擇項包括:FetchType.EAGER 和FetchType.LAZY。 
               *FetchType.EAGER表示關系類(本例是OrderItem類)在主類加載的時候同時加載,FetchType.LAZY表示關系類在被訪問時才加載。默認值是FetchType.LAZY。 
              
               *@OrderBy(value = "id ASC")注釋指明加載元組時按id的升序排序(降序 "DESC")
                 @JoinColumn(name = "Person_ID", referencedColumnName ="personid",unique = true)指明IDCard對應表的Person_ID列作為外鍵與Person對應表的personid列進行關聯.
          ===================================================
          以下是轉帖
          ===================================================
          @OneToOne的四個屬性

          1.targetEntity

             targetEntity 屬性是 Class 類型的屬性。定義實體一對一關系中處于從屬地位的實體類的類型。

          2.mappedBy

             mappedBy 屬性是 String 類型的屬性。mappedBy 屬性的值是當前實體在關聯實體中的屬性名稱,使用 mappedBy 可以定義實體類之間的雙向關系。如果類之間是單向關系,不需要提供定義,如果類和類之間形成雙向關系,我們就需要使用這個屬性進行定義,否則可能引起數據一致性的問題。

          3.cascade

             cascade 屬性的類型是 CascadeType[] 類型。cascade 屬性定義實體和實體之間的級聯關系。使用 cascade 屬性定義的級聯關系將被容器視為對當前類對象及其關聯類對象采取相同的操作,而且這種關系是遞歸調用的。

             cascade 的值只能從 CascadeType.PERSIST(級聯新建)、CascadeType.REMOVE(級聯刪除)、CascadeType.REFRESH(級聯刷新)、CascadeType.MERGE(級聯更新)中選擇一個或多個。還有一個更方便的選擇是使用 CascadeType.ALL,表示選擇上面全部四項。

          4.fetch

             fetch 屬性是 FetchType 類型的屬性??蛇x擇項包括:FetchType.EAGER 和 FetchType.LAZY.前者表示關聯關系的從類在主類加載的時候同時加載,后者表示關聯關系的從類在自己被訪問時才加載。默認值是 FetchType.EAGER.

          5.optional

          optional 屬性是 boolean 類型的屬性。optional 屬性用于定義關聯關系的從類對象是否必須存在。如果設置為 false,那么該屬性就不能設置為 null.默認值是 true。注釋的 optional 屬性設為 True 表示該對象可以不存在。

           1package com.persia.jpa;
           2
           3import java.io.Serializable;
           4
           5import javax.persistence.CascadeType;
           6import javax.persistence.Column;
           7import javax.persistence.Entity;
           8import javax.persistence.GeneratedValue;
           9import javax.persistence.GenerationType;
          10import javax.persistence.Id;
          11import javax.persistence.OneToOne;
          12import javax.persistence.Table;
          13
          14@Entity
          15@Table(name="person")
          16public class Person implements Serializable {
          17
          18private Integer id;
          19private String name;
          20private Short age;
          21private Address address;
          22
          23@Id
          24@GeneratedValue(strategy=GenerationType.AUTO)
          25public Integer getId() {
          26return id;
          27}

          28public void setId(Integer id) {
          29this.id = id;
          30}

          31
          32@Column(name="personname",nullable=false,length=32)
          33public String getName() {
          34return name;
          35}

          36public void setName(String name) {
          37this.name = name;
          38}

          39public Short getAge() {
          40return age;
          41}

          42public void setAge(Short age) {
          43this.age = age;
          44}

          45
          46@OneToOne(optional=true,cascade=CascadeType.ALL,mappedBy="person")
          47public Address getAddress() {
          48return address;
          49}

          50public void setAddress(Address address) {
          51this.address = address;
          52}

          53
          54}

          55


          -------------------------------------------------------------------------------------------------------------------------
          1.javax.persistence.JoinColumn 注釋可以和 javax.persistence.OneToOne 注釋一起使用,用于定義關聯關系中的主類在數據庫中對應的表

            通過什么字段和關聯關系中的從類的主鍵進行關聯,這個注釋是可選的,如果不提供該注釋,OpenJPA 會默認使用“對象名_ID”和關聯表的主鍵

            字段進行關聯。

          2.JoinColumn 注釋支持兩個重要屬性:name 和 referencedColumnName 屬性。

          (1)name

          name 屬性的類型是 String 類型。name 屬性用于指定關聯關系中的主類對應的表中和關聯關系中的從類的主鍵進行關聯的字段的名稱。

          (2)referencedColumnName

          referencedColumnName 屬性的類型是 String 類型。referencedColumnName 屬性指定關聯關系中的從類與關聯關系中的主類對應的表

             之間形成關聯關系的字段名稱,通常用于關聯關系中的從類的關聯字段不是自己的主鍵的情況。

           1package com.persia.jpa;
           2
           3import java.io.Serializable;
           4
           5import javax.persistence.CascadeType;
           6import javax.persistence.Entity;
           7import javax.persistence.GeneratedValue;
           8import javax.persistence.GenerationType;
           9import javax.persistence.Id;
          10import javax.persistence.JoinColumn;
          11import javax.persistence.OneToOne;
          12import javax.persistence.Table;
          13
          14@Entity
          15@Table(name="address")
          16public class Address implements Serializable {
          17
          18private Integer id;
          19private String city;
          20private String street;
          21private Person person;
          22
          23@Id
          24@GeneratedValue(strategy=GenerationType.AUTO)
          25public Integer getId() {
          26return id;
          27}

          28public void setId(Integer id) {
          29this.id = id;
          30}

          31public String getCity() {
          32return city;
          33}

          34public void setCity(String city) {
          35this.city = city;
          36}

          37public String getStreet() {
          38return street;
          39}

          40public void setStreet(String street) {
          41this.street = street;
          42}

          43
          44@OneToOne(optional=false,cascade=CascadeType.ALL)
          45@JoinColumn(name="person_id",referencedColumnName="id",unique=true)
          46public Person getPerson() {
          47return person;
          48}

          49public void setPerson(Person person) {
          50this.person = person;
          51}

          52}

          使用 JoinColumn 注釋設置兩個對象對應數據庫表之間的關聯字段

          name 屬性指定關聯關系中主類對應表中參與關聯關系的字段名稱,

          referencedColumnNam 屬性指定關聯關系中從類對應表中參與關聯關系的字段名稱。



          --------------------------------------------------------------------

          實體操作:

           1package com.persia.jpa;
           2
           3import javax.ejb.Remote;
           4import javax.ejb.Stateless;
           5import javax.persistence.EntityManager;
           6import javax.persistence.PersistenceContext;
           7
           8@Stateless
           9@Remote({OneToOneDAO.class})
          10public class OneToOneDAOBean implements OneToOneDAO {
          11
          12@PersistenceContext
          13private EntityManager em;
          14
          15@Override
          16public void deleteAddress(Integer id) {
          17// TODO Auto-generated method stub
          18       Address a=em.find(Address.class, id);
          19       em.remove(a);
          20}

          21
          22@Override
          23public void deletePerson(Integer id) {
          24// TODO Auto-generated method stub
          25Person p=em.find(Person.class,id);
          26     em.remove(p);
          27}

          28
          29@Override
          30public Person getPersonByID(Integer id) {
          31// TODO Auto-generated method stub
          32Person p=em.find(Person.class,id);
          33return p;
          34}

          35
          36@Override
          37public void insertPerson(String name, short age, String city, String street) {
          38// TODO Auto-generated method stub
          39        Person p=new Person();
          40        p.setName(name);
          41        p.setAge(age);
          42        Address address=new Address();
          43        address.setCity(city);
          44        address.setStreet(street);
          45        address.setPerson(p);
          46        p.setAddress(address);
          47        em.persist(p);
          48       
          49}

          50
          51@Override
          52public void updatePersonInfo(Integer id, String newname, String newstreet) {
          53// TODO Auto-generated method stub
          54        Person p=em.find(Person.class,id);
          55        p.setName(newname);
          56        Address a=p.getAddress();
          57        a.setStreet(newstreet);
          58  }

          59
          60}

          61

          疑問:在updatePersonInfo中不需要merge嗎?

             如果是在客戶端來setter設置的話,需要merge。



          -------------------------------------------------------------------------------------------------------------------------------------

          客戶端:


           1package com.persia.jpa.test;
           2
           3import java.util.Properties;
           4
           5import javax.naming.InitialContext;
           6import javax.naming.NamingException;
           7
           8import com.persia.jpa.oto.OneToOneDAO;
           9import com.persia.jpa.oto.Person;
          10
          11
          12public class Test {
          13
          14
          15public static void main(String[] args) throws NamingException {
          16Properties props=new Properties();
          17      props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
          18      props.setProperty("java.naming.provider.url","localhost:1099");
          19      props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");
          20InitialContext context=new InitialContext(props);
          21try{
          22OneToOneDAO dao=(OneToOneDAO)context.lookup("OneToOneDAOBean/remote");
          23// dao.insertPerson("persia",new Short((short)26), "beijing", "shangdi");
          24//dao.insertPerson("linda", new Short((short)26), "beijing", "shangdi");
          25// dao.deletePerson(new Integer(8));
          26Person p=dao.getPersonByID(new Integer(5));
          27System.out.println(p.getName()+"-"+p.getAddress().getStreet());
          28dao.updatePersonInfo(new Integer(5), "persiacai""fujian");
          29   dao.deleteAddress(new Integer(10));
          30   }
          catch(Exception e){
          31e.printStackTrace();
          32}

          33
          34}

          35
          36}

          37

          posted on 2010-06-04 22:39 [ 王志偉 ] 閱讀(599) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆檔案(3)

          文章檔案(29)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 芦山县| 双辽市| 凌源市| 长乐市| 江达县| 绥中县| 阳高县| 兴山县| 本溪市| 密山市| 奎屯市| 上虞市| 烟台市| 凤凰县| 成都市| 苍溪县| 潢川县| 射阳县| 南和县| 伊通| 哈密市| 新营市| 佛坪县| 金川县| 博兴县| 玛多县| 景洪市| 齐齐哈尔市| 晋中市| 施甸县| 响水县| 崇州市| 津南区| 宜丰县| 长寿区| 中宁县| 灵武市| 巍山| 乳源| 苏尼特左旗| 简阳市|