2010年3月22日

            由于項目需要部署在Linux上,而又使用到Apache James作郵件服務器,因此總結了一下在Linux上部署Apache James的步驟,寫得比較凌亂。

          在Linux上部署Apache James

          前提工作:

          1)由于Apache James郵件服務需要用到1024以下的端口,因此請用root用戶登錄進行部署。

          2)需要先安裝JDK1.5或以上版本,部署前請確保您的JDK環境變量如JAVA_HOME等已經設置好。

          3)James 啟動時,其SMTP 服務默認在 25 端口啟動,POP3 服務默認在 110 端口啟動, NNTP 服務默認在 119 端口啟動, 請確保這些端口未被占用。Linux下查過這些端口是否被占用的命令是:lsof -i:端口號,例如:

          [root@nhslj-app ~]# lsof -i:25

          COMMAND   PID USER   FD   TYPE DEVICE SIZE NODE NAME

          sendmail 3268 root    4u  IPv4   8650       TCP nhslj-app:smtp (LISTEN)

          這表示25端口正在被sendmail服務占用。

          關閉SendMail服務:

          一般RedHat的系統安裝時都會默認安裝了sendmail郵件服務,因此在部署Apache James時,需要把sendmail關閉。可以通過以下方法來關閉sendmail,以防止系統重啟時又自動啟動sendmail服務。

          1)用chkconfig --list sendmail命令查看sendmail的情況:

          [root@susun177 ~]# chkconfig --list sendmail

          sendmail        0:關閉  1:關閉  2:啟用  3:關閉  4:啟用  5:啟用  6:關閉

          2)通過chkconfig sendmail off命令來關閉sendmail的啟動:

          [root@susun177 ~]# chkconfig sendmail off

          3)這時再用chkconfig --list sendmail命令可以查看到sendmail的所有啟動級別都已經關閉了:

          [root@susun177 ~]# chkconfig --list sendmail

          sendmail        0:關閉  1:關閉  2:關閉  3:關閉  4:關閉  5:關閉  6:關閉

          這樣,即使重新啟動Linux系統,sendmail服務也不會自動啟動了。

          前期工作做完了,接下來就是部署Apache  James了。

          1)解壓Apache James包(apache-james-2.3.2.tar.gz):

          [root@susun177 local]# tar zxvf apache-james-2.3.2.tar.gz

          解壓后,會多了一個目錄james-2.3.2

          2)進入james-2.3.2/bin目錄,運行run.sh,生成james的配置文件config.xml:

          [root@susun177 bin]# sh run.sh

          run.sh: line 37: /usr/local/james-2.3.2/bin/phoenix.sh: 權限不夠

          權限不夠(估計是解壓后run.sh文件沒有賦予執行權限),可以執行以下命令:

          [root@susun177 bin]# chmod +x run.sh phoenix.sh

          然后再次運行run.sh命令:

          [root@susun177 bin]# sh run.sh

          Using PHOENIX_HOME:   /usr/local/james-2.3.2

          Using PHOENIX_TMPDIR: /usr/local/james-2.3.2/temp

          Using JAVA_HOME:      /usr/java/jdk1.5.0

          Running Phoenix:

          Phoenix 4.2

          James Mail Server 2.3.2

          Remote Manager Service started plain:4555

          POP3 Service started plain:110

          SMTP Service started plain:25

          NNTP Service started plain:119

          FetchMail Disabled

          說明James啟動成功。

          3)按Ctrl + C退出James,編輯config.xml文件。生成的config.xml放置在../james-2.3.2/apps/james/SAR- INF目錄下。關于James的config.xml的修改,網上很多資料,請自行查閱。在這里,只寫關鍵的修改:

          A)找到<servernames autodetect="true" autodetectIP="true"> 設成        

                   autodetect="false" autodetectIP="false"

                   autodetct設為true會自動偵測你的主機名,設成false會用你指定的server name。

                   autodetectIP設為true會為你的servername加上ip。

          B)設置servername 將默認的為localhost改成你的server名字 如king.cn:

          <servername>king.cn</servername>

          然后修改Linux的hosts主機設置文件:

          [root@susun177 SAR-INF]# vi /etc/hosts

          在打開的文件添加一行,然后保存:

          192.168.1.177           king.cn   king

          注意:第一個為IP地址  第二個為主機域名  第三個為主機名稱

          提示:名字后面應該要加上.com或者.cn這樣163等郵件服務器才不會拒絕的。

          C)注釋掉

                   <mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor>

                       <processor> relay-denied </processor>

                       <notice>550 - Requested action not taken: relaying denied</notice>

                   </mailet>

          D)配置DNS Server,先通過netstat命令查看dns配置

          [root@susun177 SAR-INF]# netstat -rn

          Kernel IP routing table

          Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface

          192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0

          169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0

          找到<dnsserver>,在<servers>里最前面添加一行: <server>192.168.1.0</server> ,                同時設置autodiscover為false。

             <dnsserver>

                <servers>

                   <!--Enter ip address of your DNS server, one IP address per server -->

                   <!-- element. -->

                   <!--

                    <server>127.0.0.1</server>

                   -->

                     <server>10.168.0.10</server>         

                </servers>

                <!-- Change autodiscover to false if you would like to turn off autodiscovery -->

                <!-- and set the DNS servers manually in the <servers> section -->

                <autodiscover>false</autodiscover>

                <authoritative>false</authoritative>

                <!-- Maximum number of entries to maintain in the DNS cache -->

                <maxcachesize>50000</maxcachesize>

             </dnsserver>

          E)修改James數據庫連接字符串:

                <data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">

                   <driver>oracle.jdbc.driver.OracleDriver</driver>

                   <dburl>jdbc:oracle:thin:@192.168.1.17:1521:hello</dburl>

                   <user>hello</user>

                   <password>kitty</password>

                   <keep-alive>select 1 from dual</keep-alive>

                   <testOnBorrow>true</testOnBorrow>

                   <testOnReturn>true</testOnReturn>

                   <max>50</max>

                </data-source>

          以上用的是oracle數據庫,如果是其他數據庫,則需要修改為對應的數據庫連接驅動,以及數據庫用戶信息。

          注意:一定要記得配置<keep-alive>,該參數的意思是,在使用連接池的連接之前,是否需要驗證該連接是否有效。之前,我沒有設置該參數,結果總是出現收不到郵件的問題。

          4)優化一下James內存,在../james-2.3.2/bi/phoenix.sh加入:

          # Set Heap Size 2007-0818,fix OutOfMemory bug while transporting big mail

          PHOENIX_JVM_OPTS="$PHOENIX_JVM_OPTS -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M"

          修改../james-2.3.2/conf/wrapper.conf的jvm配置,設置初始內存128M,最大內存512M

                             # Initial Java Heap Size (in MB)

                             #wrapper.java.initmemory=16

                             wrapper.java.initmemory=128

                  

                             # Maximum Java Heap Size (in MB)

                             #wrapper.java.maxmemory=64

                             wrapper.java.maxmemory=512

          5) 復制數據庫驅動到../james-2.3.2/lib目錄下,我用的是oracle數據庫,驅動包為:ojdbc14.jar

          6)重啟Apache James服務。

          7)最后,進入郵件系統全局管理,將系統的域名改為上述的server name。

          8)如無意外一切OK。

          posted @ 2011-03-24 20:35 別昨非 閱讀(5011) | 評論 (0)編輯 收藏
           
          1. Map<String,String> map = new HashMap<String,String>();  
          2. for(Map.Entry<String, String> entry : map.entrySet()){  
          3.     String value = entry.getValue();  
          4.     String key = entry.getKey();  
          5. }
          posted @ 2011-03-24 11:08 別昨非 閱讀(353) | 評論 (0)編輯 收藏
           

          PHP數據類型轉換

          PHP的數據類型轉換屬于強制轉換,允許轉換的PHP數據類型有:

          •(int)、(integer):轉換成整形
          •(float)、(double)、(real):轉換成浮點型
          •(string):轉換成字符串
          •(bool)、(boolean):轉換成布爾類型
          •(array):轉換成數組
          •(object):轉換成對象
          PHP數據類型有三種轉換方式:

          •在要轉換的變量之前加上用括號括起來的目標類型
          •使用3個具體類型的轉換函數,intval()、floatval()、strval()
          •使用通用類型轉換函數settype(mixed var,string type)
           第一種轉換方式: (int)  (bool)  (float)  (string)  (array) (object)

           
          1.<?php   
          2.$num1=3.14;   
          3.$num2=(int)$num1;   
          4.var_dump($num1); //輸出float(3.14)   
          5.var_dump($num2); //輸出int(3)   
          6.?>  
          第二種轉換方式:  intval()  floatval()  strval()

           
          1.<?php   
          2.$str="123.9abc";   
          3.$int=intval($str);     //轉換后數值:123   
          4.$float=floatval($str); //轉換后數值:123.9   
          5.$str=strval($float);   //轉換后字符串:"123.9"    
          6.?>  
          第三種轉換方式:  settype();

           
          1.<?php   
          2.$num4=12.8;   
          3.$flg=settype($num4,"int");   
          4.var_dump($flg);  //輸出bool(true)   
          5.var_dump($num4); //輸出int(12)   
          6.?> 

          posted @ 2010-03-31 20:25 別昨非 閱讀(70497) | 評論 (3)編輯 收藏
           
          1. $(document).ready(function(){    
          2.   
          3. /* 設置默認屬性 */    
          4. $.validator.setDefaults({    
          5.   submitHandler: function(form) { form.submit(); }    
          6. });    
          7. // 中文字兩個字節    
          8. jQuery.validator.addMethod("byteRangeLength", function(value, element, param) {    
          9.   var length = value.length;    
          10.   for(var i = 0; i < value.length; i++){    
          11.    if(value.charCodeAt(i) > 127){    
          12.     length++;    
          13.    }    
          14.   }    
          15.   return this.optional(element) || ( length >= param[0] && length <= param[1] );    
          16. }, "請確保輸入的值在3-15個字節之間(一個中文字算2個字節)");    
          17.   
          18. /* 追加自定義驗證方法 */    
          19. // 身份證號碼驗證    
          20. jQuery.validator.addMethod("isIdCardNo", function(value, element) {    
          21.   return this.optional(element) || isIdCardNo(value);    
          22. }, "請正確輸入您的身份證號碼");    
          23.   
          24. // 字符驗證    
          25. jQuery.validator.addMethod("userName", function(value, element) {    
          26.   return this.optional(element) || /^[\u0391-\uFFE5\w]+$/.test(value);    
          27. }, "用戶名只能包括中文字、英文字母、數字和下劃線");    
          28.   
          29. // 手機號碼驗證    
          30. jQuery.validator.addMethod("isMobile", function(value, element) {    
          31.   var length = value.length;    
          32.   return this.optional(element) || (length == 11 && /^(((13[0-9]{1})|(15[0-9]{1}))+\d{8})$/.test(value));    
          33. }, "請正確填寫您的手機號碼");    
          34.   
          35. // 電話號碼驗證    
          36. jQuery.validator.addMethod("isPhone", function(value, element) {    
          37.   var tel = /^(\d{3,4}-?)?\d{7,9}$/g;    
          38.   return this.optional(element) || (tel.test(value));    
          39. }, "請正確填寫您的電話號碼");    
          40.   
          41. // 郵政編碼驗證    
          42. jQuery.validator.addMethod("isZipCode", function(value, element) {    
          43.   var tel = /^[0-9]{6}$/;    
          44.   return this.optional(element) || (tel.test(value));    
          45. }, "請正確填寫您的郵政編碼");    
          46. $(regFrom).validate({    
          47. /* 設置驗證規則 */    
          48.   rules: {    
          49.    userName: {    
          50.     required: true,    
          51.     userName: true,    
          52.     byteRangeLength: [3,15]    
          53.    },    
          54.    password: {    
          55.     required: true,    
          56.     minLength: 5    
          57.    },    
          58.    repassword: {    
          59.     required: true,    
          60.     minLength: 5,    
          61.     equalTo: "#password"    
          62.    },    
          63.    question: {    
          64.     required: true    
          65.    },    
          66.    answer: {    
          67.     required: true    
          68.    },    
          69.    realName: {    
          70.     required: true    
          71.    },    
          72.    cardNumber: {    
          73.     isIdCardNo: true    
          74.    },    
          75.    mobilePhone: {    
          76.     isMobile: true    
          77.    },    
          78.    phone: {    
          79.     isPhone: true    
          80.    },    
          81.    email: {    
          82.     required: true,    
          83.     email: true    
          84.    },    
          85.    zipCode: {    
          86.     isZipCode:true    
          87.    }    
          88.   },    
          89. /* 設置錯誤信息 */    
          90.   messages: {    
          91.    userName: {    
          92.     required: "請填寫用戶名",    
          93.     byteRangeLength: "用戶名必須在3-15個字符之間(一個中文字算2個字符)"    
          94.    },    
          95.    password: {    
          96.     required: "請填寫密碼",    
          97.     minlength: jQuery.format("輸入{0}.")    
          98.    },    
          99.    repassword: {    
          100.     required: "請填寫確認密碼",    
          101.     equalTo: "兩次密碼輸入不相同"    
          102.    },    
          103.    question: {    
          104.     required: "請填寫您的密碼提示問題"    
          105.    },    
          106.    answer: {    
          107.     required: "請填寫您的密碼提示答案"    
          108.    },    
          109.    realName: {    
          110.     required: "請填寫您的真實姓名"    
          111.    },    
          112.    email: {    
          113.     required: "請輸入一個Email地址",    
          114.     email: "請輸入一個有效的Email地址"    
          115.    }    
          116.   },    
          117. /* 錯誤信息的顯示位置 */    
          118.   errorPlacement: function(error, element) {    
          119.    error.appendTo( element.parent() );    
          120.   },    
          121. /* 驗證通過時的處理 */    
          122.   success: function(label) {    
          123.    // set   as text for IE    
          124.    label.html(" ").addClass("checked");    
          125.   },    
          126. /* 獲得焦點時不驗證 */    
          127.   focusInvalid: false,    
          128.   onkeyup: false    
          129. });    
          130.   
          131. // 輸入框獲得焦點時,樣式設置    
          132. $('input').focus(function(){    
          133.   if($(this).is(":text") || $(this).is(":password"))    
          134.    $(this).addClass('focus');    
          135.   if ($(this).hasClass('have_tooltip')) {    
          136.    $(this).parent().parent().removeClass('field_normal').addClass('field_focus');    
          137.   }    
          138. });    
          139.   
          140. // 輸入框失去焦點時,樣式設置    
          141. $('input').blur(function() {    
          142.   $(this).removeClass('focus');    
          143.   if ($(this).hasClass('have_tooltip')) {    
          144.    $(this).parent().parent().removeClass('field_focus').addClass('field_normal');    
          145.   }    
          146. });    
          147. });   
          posted @ 2010-03-31 15:27 別昨非 閱讀(892) | 評論 (0)編輯 收藏
           

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
          <title>jQuery validation plug-in - main demo</title>

          <link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" />

          <script src="../lib/jquery.js" type="text/javascript"></script>
          <script src="../jquery.validate.js" type="text/javascript"></script>

          <script type="text/javascript">
          $.validator.setDefaults({
           submitHandler: function() { alert("submitted!"); }
          });

          $().ready(function() {
           // validate the comment form when it is submitted
           $("#commentForm").validate();
           
           // validate signup form on keyup and submit
           $("#signupForm").validate({
            rules: {
             firstname: "required",
             lastname: "required",
             username: {
              required: true,
              minlength: 2
             },
             password: {
              required: true,
              minlength: 5
             },
             confirm_password: {
              required: true,
              minlength: 5,
              equalTo: "#password"
             },
             email: {
              required: true,
              email: true
             },
             topic: {
              required: "#newsletter:checked",
              minlength: 2
             },
             agree: "required"
            },
            messages: {
             firstname: "Please enter your firstname",
             lastname: "Please enter your lastname",
             username: {
              required: "Please enter a username",
              minlength: "Your username must consist of at least 2 characters"
             },
             password: {
              required: "Please provide a password",
              minlength: "Your password must be at least 5 characters long"
             },
             confirm_password: {
              required: "Please provide a password",
              minlength: "Your password must be at least 5 characters long",
              equalTo: "Please enter the same password as above"
             },
             email: "Please enter a valid email address",
             agree: "Please accept our policy"
            }
           });
           
           // propose username by combining first- and lastname
           $("#username").focus(function() {
            var firstname = $("#firstname").val();
            var lastname = $("#lastname").val();
            if(firstname && lastname && !this.value) {
             this.value = firstname + "." + lastname;
            }
           });
           
           //code to hide topic selection, disable for demo
           var newsletter = $("#newsletter");
           // newsletter topics are optional, hide at first
           var inital = newsletter.is(":checked");
           var topics = $("#newsletter_topics")[inital ? "removeClass" : "addClass"]("gray");
           var topicInputs = topics.find("input").attr("disabled", !inital);
           // show when newsletter is checked
           newsletter.click(function() {
            topics[this.checked ? "removeClass" : "addClass"]("gray");
            topicInputs.attr("disabled", !this.checked);
           });
          });
          </script>

          <style type="text/css">
          #commentForm { width: 500px; }
          #commentForm label { width: 250px; }
          #commentForm label.error, #commentForm input.submit { margin-left: 253px; }
          #signupForm { width: 670px; }
          #signupForm label.error {
           margin-left: 10px;
           width: auto;
           display: inline;
          }
          #newsletter_topics label.error {
           display: none;
           margin-left: 103px;
          }
          </style>

          </head>
          <body>

          <h1 id="banner"><a >jQuery Validation Plugin</a> Demo</h1>
          <div id="main">

          <p>Default submitHandler is set to display an alert into of submitting the form</p>

          <form class="cmxform" id="commentForm" method="get" action="">
           <fieldset>
            <legend>Please provide your name, email address (won't be published) and a comment</legend>
            <p>
             <label for="cname">Name (required, at least 2 characters)</label>
             <input id="cname" name="name" class="required" minlength="2" />
            <p>
             <label for="cemail">E-Mail (required)</label>
             <input id="cemail" name="email" class="required email" />
            </p>
            <p>
             <label for="curl">URL (optional)</label>
             <input id="curl" name="url" class="url" value="" />
            </p>
            <p>
             <label for="ccomment">Your comment (required)</label>
             <textarea id="ccomment" name="comment" class="required"></textarea>
            </p>
            <p>
             <input class="submit" type="submit" value="Submit"/>
            </p>
           </fieldset>
          </form>

          <form class="cmxform" id="signupForm" method="get" action="">
           <fieldset>
            <legend>Validating a complete form</legend>
            <p>
             <label for="firstname">Firstname</label>
             <input id="firstname" name="firstname" />
            </p>
            <p>
             <label for="lastname">Lastname</label>
             <input id="lastname" name="lastname" />
            </p>
            <p>
             <label for="username">Username</label>
             <input id="username" name="username" />
            </p>
            <p>
             <label for="password">Password</label>
             <input id="password" name="password" type="password" />
            </p>
            <p>
             <label for="confirm_password">Confirm password</label>
             <input id="confirm_password" name="confirm_password" type="password" />
            </p>
            <p>
             <label for="email">Email</label>
             <input id="email" name="email" />
            </p>
            <p>
             <label for="agree">Please agree to our policy</label>
             <input type="checkbox" class="checkbox" id="agree" name="agree" />
            </p>
            <p>
             <label for="newsletter">I'd like to receive the newsletter</label>
             <input type="checkbox" class="checkbox" id="newsletter" name="newsletter" />
            </p>
            <fieldset id="newsletter_topics">
             <legend>Topics (select at least two) - note: would be hidden when newsletter isn't selected, but is visible here for the demo</legend>
             <label for="topic_marketflash">
              <input type="checkbox" id="topic_marketflash" value="marketflash" name="topic" />
              Marketflash
             </label>
             <label for="topic_fuzz">
              <input type="checkbox" id="topic_fuzz" value="fuzz" name="topic" />
              Latest fuzz
             </label>
             <label for="topic_digester">
              <input type="checkbox" id="topic_digester" value="digester" name="topic" />
              Mailing list digester
             </label>
             <label for="topic" class="error">Please select at least two topics you'd like to receive.</label>
            </fieldset>
            <p>
             <input class="submit" type="submit" value="Submit"/>
            </p>
           </fieldset>
          </form>

          <h3>Syntetic examples</h3>
          <ul>
           <li><a href="errorcontainer-demo.html">Error message containers in action</a></li>
           <li><a href="custom-messages-metadata-demo.html">Custom Messages as Metadata</a></li>
           <li><a href="radio-checkbox-select-demo.html">Radio and checkbox buttons and selects</a></li>
           <li><a href="ajaxSubmit-intergration-demo.html">Integration with Form Plugin (AJAX submit)</a></li>
           <li><a href="custom-methods-demo.html">Custom methods and message display.</a></li>
           <li><a href="dynamic-totals.html">Dynamic forms</a></li>
           <li><a href="themerollered.html">Forms styled with jQuery UI Themeroller</a></li>
          </ul>
          <h3>Real-world examples</h3>
          <ul>
           <li><a href="milk/">Remember The Milk signup form</a></li>
           <li><a href="marketo/">Marketo signup form</a></li>
           <li><a href="multipart/">Buy and Sell a House multipart form</a></li>
           <li><a href="captcha/">Remote captcha validation</a></li>
          </ul>

          <h3>Testsuite</h3>
          <ul>
           <li><a href="../test/">Validation Testsuite</a></li>
          </ul> 

          </div>

          <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
          </script>
          <script type="text/javascript">
          _uacct = "UA-2623402-1";
          urchinTracker();
          </script>
          </body>
          </html>

          posted @ 2010-03-31 15:27 別昨非 閱讀(3511) | 評論 (3)編輯 收藏
           

          Table
          Table用來定義entity主表的name,catalog,schema等屬性。
          元數據屬性說明:
          · name: 表名
          · catalog: 對應關系數據庫中的catalog
          · schema:對應關系數據庫中的schema
          · UniqueConstraints:定義一個UniqueConstraint數組,指定需要建唯一約束的列
                  
          @Entity
          @Table(name="CUST")
          public class Customer { ... }
            
          SecondaryTable
          一個entity class可以映射到多表,SecondaryTable用來定義單個從表的名字,主鍵名字等屬性。
          元數據屬性說明:
          · name: 表名
          · catalog: 對應關系數據庫中的catalog
          · schema:對應關系數據庫中的schema
          · pkJoin: 定義一個PrimaryKeyJoinColumn數組,指定從表的主鍵列
          · UniqueConstraints:定義一個UniqueConstraint數組,指定需要建唯一約束的列
          下面的代碼說明Customer類映射到兩個表,主表名是CUSTOMER,從表名是CUST_DETAIL,從表的主鍵列和主表的主鍵列類型相同,列名為CUST_ID。
                  
          @Entity
          @Table(name="CUSTOMER")
          @SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))
          public class Customer { ... }

          SecondaryTables
          當一個entity class映射到一個主表和多個從表時,用SecondaryTables來定義各個從表的屬性。
          元數據屬性說明:
          · value: 定義一個SecondaryTable數組,指定每個從表的屬性。
                  
          @Table(name = "CUSTOMER")
          @SecondaryTables( value = {
          @SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),
          @SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })
          public class Customer {}

          UniqueConstraint
          UniqueConstraint定義在Table或SecondaryTable元數據里,用來指定建表時需要建唯一約束的列。
          元數據屬性說明:
          · columnNames:定義一個字符串數組,指定要建唯一約束的列名。
                  
          @Entity
          @Table(name="EMPLOYEE",
          uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}
          )
          public class Employee { ... }

          Column
          Column元數據定義了映射到數據庫的列的所有屬性:列名,是否唯一,是否允許為空,是否允許更新等。
          元數據屬性說明:
          · name:列名。
          · unique: 是否唯一
          · nullable: 是否允許為空
          · insertable: 是否允許插入
          · updatable: 是否允許更新
          · columnDefinition: 定義建表時創建此列的DDL
          · secondaryTable: 從表名。如果此列不建在主表上(默認建在主表),該屬性定義該列所在從表的名字。
                  
          public class Person {
          @Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)
          private String name;
          @Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")
          private byte[] picture;

          JoinColumn
          如果在entity class的field上定義了關系(one2one或one2many等),我們通過JoinColumn來定義關系的屬性。JoinColumn的大部分屬性和Column類似。
          元數據屬性說明:
          · name:列名。
          · referencedColumnName:該列指向列的列名(建表時該列作為外鍵列指向關系另一端的指定列)
          · unique: 是否唯一
          · nullable: 是否允許為空
          · insertable: 是否允許插入
          · updatable: 是否允許更新
          · columnDefinition: 定義建表時創建此列的DDL
          · secondaryTable: 從表名。如果此列不建在主表上(默認建在主表),該屬性定義該列所在從表的名字。
          下面的代碼說明Custom和Order是一對一關系。在Order對應的映射表建一個名為CUST_ID的列,該列作為外鍵指向Custom對應表中名為ID的列。
                  
          public class Custom {
          @OneToOne
          @JoinColumn(
          name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)
          public Order getOrder() {
          return order;
          }

          JoinColumns
          如果在entity class的field上定義了關系(one2one或one2many等),并且關系存在多個JoinColumn,用JoinColumns定義多個JoinColumn的屬性。
          元數據屬性說明:
          · value: 定義JoinColumn數組,指定每個JoinColumn的屬性。
          下面的代碼說明Custom和Order是一對一關系。在Order對應的映射表建兩列,一列名為CUST_ID,該列作為外鍵指向Custom對應表中名為ID的列,另一列名為CUST_NAME,該列作為外鍵指向Custom對應表中名為NAME的列。
                  
          public class Custom {
          @OneToOne
          @JoinColumns({
          @JoinColumn(name="CUST_ID", referencedColumnName="ID"),
          @JoinColumn(name="CUST_NAME", referencedColumnName="NAME")
          })
          public Order getOrder() {
          return order;
          }

          Id
          聲明當前field為映射表中的主鍵列。id值的獲取方式有五種:TABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracle和DB2支持SEQUENCE,SQL Server和Sybase支持IDENTITY,mysql支持AUTO。所有的數據庫都可以指定為AUTO,我們會根據不同數據庫做轉換。NONE (默認)需要用戶自己指定Id的值。元數據屬性說明:
          · generate():主鍵值的獲取類型
          · generator():TableGenerator的名字(當generate=GeneratorType.TABLE才需要指定該屬性)
          下面的代碼聲明Task的主鍵列id是自動增長的。(Oracle和DB2從默認的SEQUENCE取值,SQL Server和Sybase該列建成IDENTITY,mysql該列建成auto increment。)
                  
          @Entity
          @Table(name = "OTASK")
          public class Task {
          @Id(generate = GeneratorType.AUTO)
          public Integer getId() {
          return id;
          }
          }

          IdClass
          當entity class使用復合主鍵時,需要定義一個類作為id class。id class必須符合以下要求:類必須聲明為public,并提供一個聲明為public的空構造函數。必須實現Serializable接,覆寫 equals()和hashCode()方法。entity class的所有id field在id class都要定義,且類型一樣。
          元數據屬性說明:
          · value: id class的類名
             public class EmployeePK implements Java.io.Serializable{
                 String empName;
                 Integer empAge;

                 public EmployeePK(){}
                 public boolean equals(Object obj){ ......}
                 public int hashCode(){......}
              }

              @IdClass(value=com.acme.EmployeePK.class)
              @Entity(access=FIELD)
              public class Employee {
                  @Id String empName;
                  @Id Integer empAge;
              }
              
               
          MapKey
          在一對多,多對多關系中,我們可以用Map來保存集合對象。默認用主鍵值做key,如果使用復合主鍵,則用id class的實例做key,如果指定了name屬性,就用指定的field的值做key。
          元數據屬性說明:
          · name: 用來做key的field名字
          下面的代碼說明Person和Book之間是一對多關系。Person的books字段是Map類型,用Book的isbn字段的值作為Map的key。
                  

          @Table(name = "PERSON")
          public class Person {
          @OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
          @MapKey(name = "isbn")
          private Map books = new HashMap();
          }


          OrderBy
          在一對多,多對多關系中,有時我們希望從數據庫加載出來的集合對象是按一定方式排序的,這可以通過OrderBy來實現,默認是按對象的主鍵升序排列。
          元數據屬性說明:
          · value: 字符串類型,指定排序方式。格式為"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序類型可以不指定,默認是ASC。
          下面的代碼說明Person和Book之間是一對多關系。集合books按照Book的isbn升序,name降序排列。
                  

          @Table(name = "MAPKEY_PERSON")
          public class Person {
          @OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
          @OrderBy(name = "isbn ASC, name DESC")
          private List books = new ArrayList();
          }


          PrimaryKeyJoinColumn
          在三種情況下會用到PrimaryKeyJoinColumn。
          · 繼承。
          · entity class映射到一個或多個從表。從表根據主表的主鍵列(列名為referencedColumnName值的列),建立一個類型一樣的主鍵列,列名由name屬性定義。
          · one2one關系,關系維護端的主鍵作為外鍵指向關系被維護端的主鍵,不再新建一個外鍵列。
          元數據屬性說明:
          · name:列名。
          · referencedColumnName:該列引用列的列名
          · columnDefinition: 定義建表時創建此列的DDL
          下面的代碼說明Customer映射到兩個表,主表CUSTOMER,從表CUST_DETAIL,從表需要建立主鍵列CUST_ID,該列和主表的主鍵列id除了列名不同,其他定義一樣。
                    @Entity
          @Table(name="CUSTOMER")
          @SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID",referencedColumnName="id"))
          public class Customer {
          @Id(generate = GeneratorType.AUTO)
          public Integer getId() {
          return id;
          }
          }

          下面的代碼說明Employee和EmployeeInfo是一對一關系,Employee的主鍵列id作為外鍵指向EmployeeInfo的主鍵列INFO_ID。
                  
          @Table(name = "Employee")
          public class Employee {
          @OneToOne
          @PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")
          EmployeeInfo info;
          }

          PrimaryKeyJoinColumns
          如果entity class使用了復合主鍵,指定單個PrimaryKeyJoinColumn不能滿足要求時,可以用PrimaryKeyJoinColumns來定義多個PrimaryKeyJoinColumn。
          元數據屬性說明:
          · value: 一個PrimaryKeyJoinColumn數組,包含所有PrimaryKeyJoinColumn。
          下面的代碼說明了Employee和EmployeeInfo是一對一關系。他們都使用復合主鍵,建表時需要在Employee表建立一個外鍵,從Employee的主鍵列id,name指向EmployeeInfo的主鍵列INFO_ID和INFO_NAME.
                  
          @Entity
          @IdClass(EmpPK.class)
          @Table(name = "EMPLOYEE")
          public class Employee {
          private int id;
          private String name;
          private String address;
          @OneToOne(cascade = CascadeType.ALL)
          @PrimaryKeyJoinColumns({
          @PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),
          @PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})
          EmployeeInfo info;
          }
          @Entity
          @IdClass(EmpPK.class)
          @Table(name = "EMPLOYEE_INFO")
          public class EmployeeInfo {
          @Id
          @Column(name = "INFO_ID")
          private int id;
          @Id
          @Column(name = "INFO_NAME")
          private String name;
          }

          Transient
          Transient用來注釋entity的屬性,指定的這些屬性不會被持久化,也不會為這些屬性建表。
                  
          @Transient
          private String name;

          Version
          Version指定實體類在樂觀事務中的version屬性。在實體類重新由EntityManager管理并且加入到樂觀事務中時,保證完整性。每一個類只能有一個屬性被指定為version,version屬性應該映射到實體類的主表上。
          下面的代碼說明versionNum屬性作為這個類的version,映射到數據庫中主表的列名是OPTLOCK。
                  
          @Version
          @Column("OPTLOCK")
          protected int getVersionNum() { return versionNum; }

          Lob
          Lob指定一個屬性作為數據庫支持的大對象類型在數據庫中存儲。使用LobType這個枚舉來定義Lob是二進制類型還是字符類型。
          LobType枚舉類型說明:
          · BLOB 二進制大對象,Byte[]或者Serializable的類型可以指定為BLOB。
          · CLOB 字符型大對象,char[]、Character[]或String類型可以指定為CLOB。
          元數據屬性說明:
          · fetch: 定義這個字段是lazy loaded還是eagerly fetched。數據類型是FetchType枚舉,默認為LAZY,即lazy loaded.
          · type: 定義這個字段在數據庫中的JDBC數據類型。數據類型是LobType枚舉,默認為BLOB。
          下面的代碼定義了一個BLOB類型的屬性和一個CLOB類型的屬性。
                  
          @Lob
          @Column(name="PHOTO" columnDefinition="BLOB NOT NULL")
          protected JPEGImage picture;
          @Lob(fetch=EAGER, type=CLOB)
          @Column(name="REPORT")
          protected String report;

          JoinTable
          JoinTable在many-to-many關系的所有者一邊定義。如果沒有定義JoinTable,使用JoinTable的默認值。
          元數據屬性說明:
          · table:這個join table的Table定義。
          · joinColumns:定義指向所有者主表的外鍵列,數據類型是JoinColumn數組。
          · inverseJoinColumns:定義指向非所有者主表的外鍵列,數據類型是JoinColumn數組。
          下面的代碼定義了一個連接表CUST和PHONE的join table。join table的表名是CUST_PHONE,包含兩個外鍵,一個外鍵是CUST_ID,指向表CUST的主鍵ID,另一個外鍵是PHONE_ID,指向表PHONE的主鍵ID。
                  
          @JoinTable(
          table=@Table(name=CUST_PHONE),
          joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
          inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
          )

          TableGenerator
          TableGenerator定義一個主鍵值生成器,在Id這個元數據的generate=TABLE時,generator屬性中可以使用生成器的名字。生成器可以在類、方法或者屬性上定義。
          生成器是為多個實體類提供連續的ID值的表,每一行為一個類提供ID值,ID值通常是整數。
          元數據屬性說明:
          · name:生成器的唯一名字,可以被Id元數據使用。
          · table:生成器用來存儲id值的Table定義。
          · pkColumnName:生成器表的主鍵名稱。
          · valueColumnName:生成器表的ID值的列名稱。
          · pkColumnValue:生成器表中的一行數據的主鍵值。
          · initialValue:id值的初始值。
          · allocationSize:id值的增量。
          下面的代碼定義了兩個生成器empGen和addressGen,生成器的表是ID_GEN。
                  
          @Entity public class Employee {
          ...
          @TableGenerator(name="empGen",
          table=@Table(name="ID_GEN"),
          pkColumnName="GEN_KEY",
          valueColumnName="GEN_VALUE",
          pkColumnValue="EMP_ID",
          allocationSize=1)
          @Id(generate=TABLE, generator="empGen")
          public int id;
          ...
          }
          @Entity public class Address {
          ...
          @TableGenerator(name="addressGen",
          table=@Table(name="ID_GEN"),
          pkColumnValue="ADDR_ID")
          @Id(generate=TABLE, generator="addressGen")
          public int id;
          ...
          }

          SequenceGenerator
          SequenceGenerator定義一個主鍵值生成器,在Id這個元數據的generator屬性中可以使用生成器的名字。生成器可以在類、方法或者屬性上定義。生成器是數據庫支持的sequence對象。
          元數據屬性說明:
          · name:生成器的唯一名字,可以被Id元數據使用。
          · sequenceName:數據庫中,sequence對象的名稱。如果不指定,會使用提供商指定的默認名稱。
          · initialValue:id值的初始值。
          · allocationSize:id值的增量。
          下面的代碼定義了一個使用提供商默認名稱的sequence生成器。
                  
          @SequenceGenerator(name="EMP_SEQ", allocationSize=25)

          DiscriminatorColumn
          DiscriminatorColumn定義在使用SINGLE_TABLE或JOINED繼承策略的表中區別不繼承層次的列。
          元數據屬性說明:
          · name:column的名字。默認值為TYPE。
          · columnDefinition:生成DDL的sql片斷。
          · length:String類型的column的長度,其他類型使用默認值10。
          下面的代碼定義了一個列名為DISC,長度為20的String類型的區別列。
                  
          @Entity
          @Table(name="CUST")
          @Inheritance(strategy=SINGLE_TABLE,
          discriminatorType=STRING,
          discriminatorValue="CUSTOMER")
          @DiscriminatorColumn(name="DISC", length=20)
          public class Customer { ... }

           

          posted @ 2010-03-24 21:07 別昨非 閱讀(293) | 評論 (0)編輯 收藏
           
          List and  ArrayList:
          1、List是一個接口,ArrayList是一個實現了List接口的具體類。 他們是父子關系,我們常用的是ArrayList,但常用List的引用去操作ArrayList 這是一個簡單的面向接口編程的一種,如:List myList = new ArrayList();
          2、他們主要是用來保存對象的集合,記得是保存對象的哦,你可別傳個int進去啊
          3、要取出它里面保存的對象可以用下標,如:Object aaa = myList.get(0); 這樣我們就把保存在myList里的第一個對象取出來給了 aaa 啦。

           ArrayList:

          ArrayList其實是包裝了一個數組Object[],當實例化一個ArrayList時,一個數組也被實例化,當向ArrayList中添加對象是,數組的大小也相應的改變。這樣就帶來以下有特點:

          快速隨即訪問 你可以隨即訪問每個元素而不用考慮性能問題,通過調用get(i)方法來訪問下標為i的數組元素。

          向其中添加對象速度慢 當你創建數組是并不能確定其容量,所以當改變這個數組時就必須在內存中做很多事情。

          操作其中對象的速度慢 當你要想數組中任意兩個元素中間添加對象時,數組需要移動所有后面的對象。

          LinkList:

          LinkedList是通過節點直接彼此連接來實現的。每一個節點都包含前一個節點的引用,后一個節點的引用和節點存儲的值。當一個新節點插入時,只需要修改其中保持先后關系的節點的引用即可,當刪除記錄時也一樣。這樣就帶來以下有特點:

          操作其中對象的速度快 只需要改變連接,新的節點可以在內存中的任何地方

          不能隨即訪問 雖然存在get()方法,但是這個方法是通過遍歷接點來定位的所以速度慢。

          一些結論:
          當一些被定義好的數據需要放到與數組對應的List中,ArrayList是很好的選擇,因為它可以動態變化,但是不要在整個應用程序中頻繁的使用。
          你要很方便的操作其中的數據而不用隨即訪問時;LinkList是很好的選擇。如果你要頻繁隨機訪問建議使用ArrayList。


          posted @ 2010-03-22 14:46 別昨非 閱讀(2089) | 評論 (0)編輯 收藏
           
          PHP 就是: Quick and Dirty Java 就是: Beauty and Slowly Ruby 就是: Quick and Beauty python 就是: Quick and Simple 如果PHP要實現跨請求的持有內存資源,這意味著PHP必須實現對象內存分配機制和垃圾收集器,而這將意味著PHP語言的復雜性上升,PHP內存泄露的危險大大增加,最終將得不償失。 其實我們應該跳出編程語言的簡單對比,而比較一下不同的編程模型背后的哲學: 1、Java - controll whole world模型 單進程運行,進程內部多線程調度,所有的資源都自己提供。 2、Ruby - controll process模型 多進程運行,進程內部可以持有資源,帶有GC,部分依賴外部資源實現(例如Cache)功能 3、PHP - controll request模型 多進程運行,進程不持有任何資源,不帶GC,完全依賴外部資源實現擴展功能 比較和探討一下3種不同的模型,以及他們的優勢,劣勢,長處,短處,適合做什么,不適合做什么。這才是一個有意思的話題。
          posted @ 2010-03-22 13:56 別昨非 閱讀(261) | 評論 (0)編輯 收藏
           
          主站蜘蛛池模板: 射阳县| 兴义市| 汾西县| 扬州市| 阿瓦提县| 兴安县| 阳东县| 赣州市| 潞西市| 砚山县| 寻甸| 临洮县| 青海省| 历史| 博野县| 武川县| 广汉市| 赣榆县| 兴隆县| 都江堰市| 苍梧县| 辽宁省| 莫力| 仪陇县| 屏东市| 九龙县| 石林| 莱芜市| 阳山县| 温泉县| 湖口县| 屏东县| 永兴县| 九寨沟县| 白水县| 屯门区| 三江| 博乐市| 武功县| 水城县| 错那县|