วันพฤหัสบดีที่ 29 กันยายน พ.ศ. 2554

Hibernate config auto load sql script

     โดยปกติ Hibernate สามารถจะโหลด sql script เข้าไปได้ ถ้าเราสร้างไฟล์ชื่อ import.sql น่ะครับ แล้วกำหนด hibernate properties
hibernate.hbm2ddl.auto ให้มีค่า create หรือ create-drop แล้ว Hibernate จะโหลดไฟล์นี้ขึ้นมาให้อัตโนมัติ (ไฟล์จะไปวางไว้ที่ classpath เช่น src/main/resources)
แต่เราจะไม่เห็น log ว่าโหลด sql script ทำสำเร็จหรือไม่สำเร็จโดย
1. ต้องไปเพิ่ม Log4j ของ package org.hibernate.tool.hbm2ddl
2. Hibernate จะใช้ slf4j มาเพราะฉะนั้นเราต้องเอา Jar ของ slf4j มาด้วย ไม่อย่างนั้นพอเวลารันไปก็ไม่เห็นอยู่ดีครับ เพิ่มใน pom.xml เข้าไปก็จะใช้งานได้แล้วครับ

        <dependency>
            <groupid>org.slf4j</groupid>
            <artifactid>slf4j-log4j12</artifactid>
            <version>1.6.2</version>
        </dependency>


     ปล. ผมใช้ hibernate 3.6.3 (ต่ำกว่านี้น่าจะใช้ได้ตั้งแต่ 3.x) จะสามารถกำหนด sql script ได้ และสามารถกำหนัดได้หลายๆ ไฟล์ โดยใช้ , ต่อกัน ซึ่งจะใช้ hibernate properties อันนี้ครับ
hibernate.hbm2ddl.import_files

วันพฤหัสบดีที่ 15 กันยายน พ.ศ. 2554

การแก้ไข error zk-spring duplicate class definition: org/zkoss/spring/beans/zkcomponents/ZKComponentBeanMethods

ถ้าลองทำตามตัวอย่าง จากที่ ZK มาให้จากลิงค์ http://books.zkoss.org/wiki/ZK_Spring_Essentials/Working_with_ZK_Spring/Working_with_ZK_Spring_Core/Inject_ZK_Components_in_Spring_Beans
นี้ แล้วอาจจะเกิด exception ตามนี้ครับ
Caused by: java.lang.LinkageError: duplicate class definition: org/zkoss/spring/beans/zkcomponents/ZKComponentBeanMethods
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:592)
        at javassist.ClassPool.toClass2(ClassPool.java:1098)
        at javassist.ClassPool.toClass(ClassPool.java:1079)
        ... 44 more


      ซึ่งมาจาก เรา เรียงลำดับการโหลดผิดใน web.xml โดยจะต้องเอา org.zkoss.spring.web.context.CoreContextListener ขึ้นก่อน org.springframework.web.context.ContextLoaderListener จะทำให้แก้ปัญหานี้ได้ครับ

วันจันทร์ที่ 5 กันยายน พ.ศ. 2554

ลง Oracle 32bit บน windows 64bit แล้วมีปัญหา ORA-12154: TNS:could not resolve the connect identifier specified

เป็นปัญหาเวลาเราลงโปรแกรม มันจะไปอยู่ที่ Program Files (x64) ครับ ต้อนจะใช้งานโปรแกรม มันจะไปหามั่วๆ เลยต้องรันผ่าน command line หรือ fixed bug ของ oracle 10g (bug id 3807408) ครับ แต่แก้ง่ายกว่านั้น รันโปรแกรมผ่าน command line เลย โดยให้ cd PROGRA~2 แทน แล้วรันโปรแกรม ก็ใช้งานได้แล้วครับ

ปล. เวลา config odbc ศำหรับ 32bit จะต้องไปรันโปรแกรม C:\Windows\SysWOW64\odbcad32.exe (ตัวนี้เป็น odbc 32bit รันปกติจะเป็นของ 64bit ครับ) แล้วก็จะใช้งานได้ครับ

Reference
http://blogs.msdn.com/b/dataaccesstechnologies/archive/2010/01/26/connectivity-issue-with-oracle-in-x64-environment-ora-12154-tns-could-not-resolve-the-connect-identifier-specified.aspx

วันพุธที่ 25 พฤษภาคม พ.ศ. 2554

Basic Spring Roo

มาเขียน Application กับ Spring Roo กัน
เรามาเริ่มเข้าใจกันก่อนว่า Spring Roo คืออะไรครับ
หยิบประโยคมาให้อ่านเลย

"Spring Roo is a next-generation rapid application development tool for Java developers."

ซึ่ง Spring Roo จะคล้ายๆ กับ Grails ตรงที่ว่าเราสามารถสร้าง Project ที่พร้อมใช้งาน CRUD ได้เลยในเวลาไม่นาน เพราะทุกอย่างจะ Mapping มาให้ใน Code เลย เราเพียงแค่ใช้ Command สร้างมันเท่านั้น

ทำให้ใช้งานกันได้ก่อนครับ
1. Download Spring Roo จาก http://www.springsource.com/download/community
2. Spring Roo ใช้ JDK6, Maven ให้โหลดมาใช้งาน และ Config Classpath, Path สำหรับ JDK, Maven ด้วยครับ (ควรจะมีพื้นฐานการใช้งาน maven)
3. Config Path โดยไปที่ roo/bin ครับ จะสามารถรันขึ้นมาใช้งานได้ จะได้หน้าตาแบบนี้




ต่อไปเรามาสร้าง Project โดยใช้ Roo กัน
1. สั่ง Roo เลย จะเข้าหน้าสำหรับ command line ซึ่ง Roo เวอร์ชั่นใหม่ (ตอนเขียนบล็อกนี้ใช้ 1.1.3) เราสามารถใช้ hint สำหรับบอกเราว่าลืมสร้างอะไรต้องทำอะไรก่อนบ้าง และมีการใช้งาน tab ในกรณีที่เราลืมคำสั่ง tab ไปจะขึ้นชื่อให้ น่ะครับ

หน้าตัวอย่าง hint

2. ถ้าดูจาก hint จะเห็ฯว่าเรายังไม่ได้สร้าง Project ขึ้น จะเห็นว่า ต้อง พิมพ์ project --topLevelPackage ชื่อ package พอทำเสร็จแล้ว roo จะสร้างไฟล์สำหรับเป็น Project ขึ้นมาซึ่งจะใช้ maven เป็นหลักน่ะครับ (ควรจะมีความรู้ maven บ้าง)



3. ต่อไปมาสร้างส่วนติดต่อฐานข้อมูล (สามารถ hint ดูได้จะบอกว่าให้สร้าง persistence น่ะครับ) จะเห็นว่า จะมีให้เลือกใช้ technology อะไร แล้วก็เลือกว่าจะใช้ฐานข้อมูลอะไร พอเลือกเสร็จ roo จะทำการเพิ่ม config ลงในส่วนของ maven (pom.xml) แล้วพวก persistence file



4. ต่อไปเรามาสร้าง Entity ขึ้นมา หรือจะสร้างบน IDE ก็ได้ (ลอง hint ดูได้จะมีขึ้นคำอธิบายเลยครับ ง่ายดีไหม) พอเลือกสร้าง (entity --class className) ตัวอย่าง entity --class ~.domain.Test



5. พอสร้างเสร็จแล้วเราก็มาสร้าง field ของ domain นั้นขึ้นมา โดยพิมพ์ field แล้วลอง tab ดูครับ ว่าอยา่ได้ ตามตัวอย่างผมสร้าง field firstName เป็น String Type




6. พอลองแล้ว มาสร้าง controller ต่อกันครับ โดย controller --class ~.web สร้างแบบนี้จะได้ CRUD (Create-Read-Update-Delete) ให้เลยน่ะครับ ที่ทำการ map กับ domain แล้ว



7. พอสร้างเสร็จทำงานได้แล้ว ถ้าเราอยาก run test ไว้ด้วยก็มี perform test แล้วระบบจะรัน (จะมี load jar สำหรับ test มา)
8. ถ้าเราอยากไปใช้งานบน eclipse สามารถรัน perform eclipse ได้เลยครับ Root ๗ะสร้าง project ให้สามารถใช้ได้บน eclipse (โดยการ Import project ก็ใช้งานได้เลย) พอกด enter เดินไปกินข้าวได้เลยครับ นานๆ
9. พิมพ์ exit ออกมษจาก Roo ได้เลยครับ
10. รันเทสได้จาก mvn tomcat:run ครับ (รัน post 8080 ถ้าใช้อยู๋จะรันไม่ขึ้นครับ) เราจะได้หน้าตาแบบนี้มาครับ