隨筆 - 11  文章 - 11  trackbacks - 0

          留言簿(2)

          隨筆分類(13)

          隨筆檔案(11)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

          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;
              }
          }
          

          相應的,在struts-config.xml中加入controller元素

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

          但剛才看到在Struts1.3中,已經不再使用RequestProcessor,而是用ComposableRequestProcessor 來實現自定義的request響應。






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

          三個@Entity類Tc, Tracer, Track是三向關聯的的表, @Embeddable類TcTracer則存儲著三個表的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的子元素,從而實現Tc的三相關聯。

          用HQL可以通過特定的Tc,Tracer得到對應的所有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) | 評論 (0)編輯 收藏

          今天調試程序的時候,發現插入數據時老是拋出異常:"a different object with the same identifier value was already associated with the session"

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

          最后發現原來問題很簡單....是在用annotation重寫mapping的時候,忘記給@Id加上@GeneratedValue,導致第一個row insert后,再次insert時沒有生成新的id!

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

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

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

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

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

          但對Hibernate而已,上面的代碼會被轉化為兩條insert語句,

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

          // !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>();
              // ...
          }
          

          上面的兩個annotation告訴Hibernate,Person是主,對Address中persons屬性的修改將不會產生SQL語句。

          Hibernate里,如果是Many-to-many的關系,可以任意設置主class

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

          // !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 閱讀(359) | 評論 (0)編輯 收藏

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

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

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

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

          posted @ 2007-03-23 08:21 hijeff 閱讀(2286) | 評論 (7)編輯 收藏

          之前都是用最蠢的方法:SQL建立數據庫相關的表,然后再Java寫映射寫配置文件.....

          實際上使用Hibernate自帶的工具hbm2ddl,建立根據你的對象建立數據庫是很愜意的一件事;)

          首先當然要建好POJO object, XML Mapping File(也可以使用工具根據POJO class建立),配置文件(hibernate.cfg.xml)

          然后運行下面的Java代碼


          import org.hibernate.cfg.Configuration; 
          import org.hibernate.tool.hbm2ddl.SchemaExport;
          
          public class SchemaUtil {
          public static void main(String[] args) {

          Configuration cfg = new Configuration().configure(); SchemaExport schemaExport= new SchemaExport(cfg); schemaExport.create(false, true); } }
          再看看數據庫,表是不是已經幫你建好了,對于我這樣不熟悉數據庫的人真是太方便了

          Technorati : , , ,
          Del.icio.us : , , ,

          posted @ 2007-03-21 00:56 hijeff 閱讀(5277) | 評論 (4)編輯 收藏

          內容詳實,通俗易懂

          決定花幾天時間好好的讀讀這本書,系統的學習Hibernate。

          Technorati : , ,
          Del.icio.us : , ,

          posted @ 2007-03-20 22:14 hijeff 閱讀(275) | 評論 (0)編輯 收藏
          Set set = new HashSet(Arrays.asList(array));
          
          posted @ 2007-03-17 21:58 hijeff 閱讀(346) | 評論 (0)編輯 收藏

          Web程序的編碼問題主要有三個方面:

          1. 程序文件的編碼;
          2. 輸出頁面到客戶端的編碼;
          3. 用戶響應到服務器端的編碼。

          以設置為UTF-8為例,可以用如下方法解決。

          1. 對于程序文件的編碼

          直接在Eclipse或者其他IDE,editor中將文件編碼設為UTF-8即可。

          2.輸出頁面

          對于JSP頁面,加入以下代碼

          <%@ page contentType="text/html; charset=UTF-8"%>
          如果在IE或者Firefox中還不能正常顯示,還可以在Html標識下加入下面的頭信息

          <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

          3. 響應到服務器端

          我使用的是Tomcat,沒有可以直接設置接受響應編碼的方法(真是太佩服了!),但可以通過寫一個Filter實現編碼轉化。

          import java.io.IOException;
          import javax.servlet.Filter;
          import javax.servlet.FilterChain;
          import javax.servlet.FilterConfig;
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          
          public class SetCharacterEncodingFilter implements Filter {
          
              protected String encoding = null;
              protected FilterConfig filterConfig = null;
              protected boolean ignore = true;
          
              public void destroy() {
                  this.encoding = null;
                  this.filterConfig = null;
              }
          
              public void doFilter(ServletRequest request, ServletResponse response,
                                    FilterChain chain)
                  throws IOException, ServletException {
                  if (ignore || (request.getCharacterEncoding() == null)) {
                      String encoding = selectEncoding(request);
                      if (encoding != null)
                          request.setCharacterEncoding(encoding);
                  }
                  chain.doFilter(request, response);
              }
          
              public void init(FilterConfig filterConfig) throws ServletException {
               this.filterConfig = filterConfig;
                  this.encoding = filterConfig.getInitParameter("encoding");
                  String value = filterConfig.getInitParameter("ignore");
                  if (value == null)
                      this.ignore = true;
                  else if (value.equalsIgnoreCase("true"))
                      this.ignore = true;
                  else if (value.equalsIgnoreCase("yes"))
                      this.ignore = true;
                  else
                      this.ignore = false;
              }
          
              protected String selectEncoding(ServletRequest request) {
                  return (this.encoding);
              }
          }
          

          將SetCharacterEncodingFilter放到程序的編譯目錄下,再在web.xml中添加相應屬性

          
              <filter>
                  <filter-name>Set Character Encoding</filter-name>
                  <filter-class>hijeff.filters.SetCharacterEncodingFilter</filter-class>
                  <init-param>
                      <param-name>encoding</param-name>
                      <param-value>UTF-8</param-value>
                  </init-param>
              </filter>
               
              <filter-mapping>
                  <filter-name>Set Character Encoding</filter-name>
                  <url-pattern>/*</url-pattern>
              </filter-mapping>    
          

          Tomcat就會將用戶通過HTTP響應的字符轉化為UTF-8的編碼了


          posted @ 2007-03-15 20:58 hijeff 閱讀(313) | 評論 (0)編輯 收藏

          via

          1. Pass an instance of java.util.Properties to Configuration.setProperties().
          2. Place hibernate.properties in a root directory of the classpath.
          3. Set System properties using java -Dproperty=value.
          4. Include <property> elements in hibernate.cfg.xml .

          posted @ 2007-03-13 10:54 hijeff 閱讀(364) | 評論 (0)編輯 收藏
          僅列出標題
          共2頁: 1 2 下一頁 
          主站蜘蛛池模板: 达孜县| 凤阳县| 洱源县| 宿州市| 汪清县| 龙州县| 正阳县| 永宁县| 上杭县| 泸溪县| 永靖县| 于都县| 竹山县| 建阳市| 花垣县| 胶州市| 沙坪坝区| 旬邑县| 乌兰县| 谢通门县| 嘉兴市| 迁西县| 大理市| 濉溪县| 包头市| 原平市| 称多县| 项城市| 彰化县| 通山县| 壶关县| 茶陵县| 大化| 安远县| 罗田县| 普定县| 闻喜县| 扬州市| 东安县| 嘉黎县| 类乌齐县|