隨筆 - 11  文章 - 11  trackbacks - 0

          留言簿(2)

          隨筆分類(13)

          隨筆檔案(11)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          在Struts1.1-1.2中如果不想沒有登錄的用戶訪問一些action,可以擴(kuò)展RequestProcessor,并重載processProprocess方法,在其中進(jìn)行驗(yàn)證

          public class CustomRequestProcessor
                  extends RequestProcessor {
              protected boolean processPreprocess (
                      HttpServletRequest request,
                      HttpServletResponse response) {
                  HttpSession session = request.getSession(false);
                  //If user is trying to access login page
                  // then don't check
                  if( request.getServletPath().equals("/loginInput.do")
                      || request.getServletPath().equals("/login.do") )
                      return true;
                  //Check if userName attribute is there is session.
                  //If so, it means user has allready logged in
                  if( session != null &&
                  session.getAttribute("userName") != null)
                      return true;
                  else{
                      try{
                          //If no redirect user to login Page
                          request.getRequestDispatcher 
                              ("/Login.jsp").forward(request,response);
                      }catch(Exception ex){
                      }
                  }
                  return false;
              }
          }
          

          相應(yīng)的,在struts-config.xml中加入controller元素

          <controller>
           <set-property  property="processorClass"
           value="com.sample.util.CustomRequestProcessor"/>
          </controller>
          

          但剛才看到在Struts1.3中,已經(jīng)不再使用RequestProcessor,而是用ComposableRequestProcessor 來實(shí)現(xiàn)自定義的request響應(yīng)。






          posted @ 2007-04-09 18:52 hijeff 閱讀(446) | 評(píng)論 (0)編輯 收藏

          三個(gè)@Entity類Tc, Tracer, Track是三向關(guān)聯(lián)的的表, @Embeddable類TcTracer則存儲(chǔ)著三個(gè)表的ForeignKey

          @Entity
          @Table(name= "tc", catalog="first_hiber")
          public class Tc {
                @org.hibernate.annotations.CollectionOfElements
                @JoinTable(name="tc_tracer", joinColumns=@JoinColumn(name="tc_id"))
                private Set<TcTracer> tcTracers = new HashSet<TcTracer>();
          
                @Id @GeneratedValue
                @Column(name="tc_id", nullable= false)
                private Long id;
          }
          
            @Embeddable
            @Table(name="tc_tracer")
            public class TcTracer {
                @org.hibernate.annotations.Parent
                private Tc tc;
            
          @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="tracer_id", nullable=false, updatable=false) private Tracer tracer; @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="track_id", nullable=false, updatable=false) private Track track; }

          如上,將TcTracer作為Tc的子元素,從而實(shí)現(xiàn)Tc的三相關(guān)聯(lián)。

          用HQL可以通過特定的Tc,Tracer得到對(duì)應(yīng)的所有Track:

            select tctracers.track
            from Tc tc
                join tc.tcTracers tctracers
            where tc.name="tc name"
                and tctracers.tracer.name="tracer name"
          
           List<Track> tracks = session.createQuery(HQL).list();
          
          posted @ 2007-04-02 17:45 hijeff 閱讀(386) | 評(píng)論 (0)編輯 收藏

          今天調(diào)試程序的時(shí)候,發(fā)現(xiàn)插入數(shù)據(jù)時(shí)老是拋出異常:"a different object with the same identifier value was already associated with the session"

          起初以為是override hashCode()的方法不對(duì)。后來google查了查多數(shù)問題都出現(xiàn)在detached對(duì)象之后,再鏈接session由于對(duì)象的改變而出現(xiàn)的異常。

          最后發(fā)現(xiàn)原來問題很簡單....是在用annotation重寫mapping的時(shí)候,忘記給@Id加上@GeneratedValue,導(dǎo)致第一個(gè)row insert后,再次insert時(shí)沒有生成新的id!

          看來annotation雖然方便了mapping,但由于和代碼集中在一塊了,很容易出現(xiàn)疏忽大意的錯(cuò)誤,而且一般都不會(huì)注意到-.-

          想起了python的SQLObject, SQLAlchemy,雖然功能沒有Hibernate豐富,但是簡單實(shí)用!

          posted @ 2007-03-29 20:28 hijeff 閱讀(414) | 評(píng)論 (0)編輯 收藏

          通常為了實(shí)現(xiàn)entity class的雙向association,每添加一組實(shí)例在java中需要兩行代碼:

          persion.getAddresses().add(address);
          address.getPersons().add(person);

          但對(duì)Hibernate而已,上面的代碼會(huì)被轉(zhuǎn)化為兩條insert語句,

          為了避免這樣的情況出現(xiàn)需要定義inverse屬性,告訴Hibernate persion和address之間的關(guān)系:

          // !file: Person.class
          public class Person {
              // ...
              @ManyToMany(
                        targetEntity= Address.class,
                        cascade = CascadeType.ALL,
                )
              @JoinTable(
                        name="persion_address",
                        joinColumns= {@JoinColumn(name="person_id")},
                        inverseJoinColumns= {@JoinColumn(name="address_id")}
                )
                private Set<Address> adressses = new HashSet<Address> (0);
              // ...
          }
          
          // !file: Address.class
          public class Address {
              // ...
              @ManyToMany(
                      targetEntity= Persion.class,
                      cascade = CascadeType.ALL, 
                      mappedBy = "addresses"
              )
              private Set<Person> persons = new HashSet<Person>();
              // ...
          }
          

          上面的兩個(gè)annotation告訴Hibernate,Person是主,對(duì)Address中persons屬性的修改將不會(huì)產(chǎn)生SQL語句。

          Hibernate里,如果是Many-to-many的關(guān)系,可以任意設(shè)置主class

          通常,還可以將添加刪除關(guān)系的代碼包裝起來:

          // !file: Person.class
          public class Person {
              // ...
              public void addAddress(Address address) {
                  this.getAddresses().add(address);
                  address.getPersons().add(this);
              }
              public void removeAddress(Address address) {
                  this.getAddresses().remove(address);
                  address.getPersons().remove(this);
              }
              //...
          } 
          



          posted @ 2007-03-27 21:18 hijeff 閱讀(360) | 評(píng)論 (0)編輯 收藏

          http://www.box.net/shared/102b5irypc

          差不多把平時(shí)用的上的讀完了,真感覺受益匪淺。不但詳細(xì)的介紹了Hibernate的特性用法,而且其中介紹的ORM基本概念,灌輸?shù)腛RM的思想也正是我所需要的。

          對(duì)一個(gè)新手來說,business key, surrogate key, entity type, value type, transient, persistent, detached, persistence context...這些是什么概念,為什么要提出來,以及怎樣實(shí)現(xiàn)的在書中都會(huì)有簡單明了的解釋。

          不多說了,現(xiàn)在把書放出來,誰看誰知道;)

          posted @ 2007-03-23 08:21 hijeff 閱讀(2289) | 評(píng)論 (7)編輯 收藏
          主站蜘蛛池模板: 绥宁县| 长岭县| 绍兴县| 山东省| 郎溪县| 巴里| 安康市| 新昌县| 孟津县| 江川县| 七台河市| 沅陵县| 古浪县| 麦盖提县| 江城| 弥勒县| 镇康县| 沅陵县| 鸡东县| 手游| 囊谦县| 宁陕县| 阿坝县| 永修县| 武强县| 拉萨市| 安仁县| 民丰县| 郑州市| 广河县| 金坛市| 怀化市| 斗六市| 岳阳市| 弥勒县| 连山| 军事| 镶黄旗| 常山县| 凤台县| 南汇区|