Amazon Ads

2014年10月31日 星期五

【閒聊】海棉寶寶出電影版將在2015年上映

哈!我滿喜歡的無釐頭搞笑卡通「海棉寶寶」竟然出電影了。

在他大受歡迎之時,我很少去注意這部卡通,直到有一次和兒子看完一集後,我喜歡上了他跳tone的搞笑方式,每每轉到,都會看到當天演完。

好像因為是美味蟹堡秘方被偷了,造成比奇堡一片混亂,為了拯求海底世界,眾搞笑班底,只好挺身而出,離開海底走到陸地尋找被偷走的秘方。


章魚哥「挫賽」的那一幕,感覺是有抄了海底總動員一下,XD

2014年10月19日 星期日

【筆記】使用JPA API中的@GeneratedValue來建立主鍵,以@TableGenerator為例

之前在【筆記】一個在Java SE中運行的簡單JPA程式有介紹如何在Java SE環境建立一個簡單的JPA應用程式。

在該範例中,我是手動幫Employee設定id,但在JPA中,可以使用GeneratedValue這個Annotation來產生主鍵,使用的策略(strategy)有四種:
public enum GenerationType { 
 TABLE, 
 SEQUENCE, 
 IDENTITY, 
 AUTO 
};
詳細說明,可以參考這裡

這裡要使用strategy=GenerationType.TABLE,使用一個TableGenerator來產生主鍵。

先在資料庫中建立一個資料表,名為ID_GEN
create table ID_GEN(GEN_KEY varchar(100), GEN_VALUE BIGINT, primary key(GEN_KEY))
再來新一筆資料:
insert into ID_GEN (GEN_KEY, GEN_VALUE) values('EMP_ID', 0)
把先前Employee這個Entity的程式碼改成:
package examples.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.TableGenerator;

@TableGenerator(
  table="ID_GEN",
  pkColumnName="GEN_KEY",
  valueColumnName="GEN_VALUE",
  pkColumnValue="EMP_ID",
  allocationSize=1, 
  name = "empGen"
)
@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy=GenerationType.TABLE, generator="empGen")
    private int id;
    private String name;
    private long salary;
    
 public Employee() {}

    public int getId() {
        return id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public long getSalary() {
        return salary;
    }

    public void setSalary(long salary) {
        this.salary = salary;
    }
    
    public String toString() {
        return "Employee id: " + getId() + " name: " + getName() + " salary: " + getSalary();
    }
}
然後修改EmployeeService中的createEmployee方法,改成不用手動設定id
public Employee createEmployee(int id, String name, long salary) {
        Employee emp = new Employee();
        emp.setName(name);
        emp.setSalary(salary);
        
        em.persist(emp);
        return emp;
    }
然後把執行的主程式改成:
package examples.client;

import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import examples.model.Employee;
import examples.model.EmployeeService;

public class EmployeeMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = 
                Persistence.createEntityManagerFactory("EmployeeService");
        EntityManager em = emf.createEntityManager();
        EmployeeService service = new EmployeeService(em);
        
        //  create and persist an employee
        em.getTransaction().begin();
        Employee emp = service.createEmployee("Bio Young", 90000);
        em.getTransaction().commit();
        System.out.println("Persisted " + emp);
        
        // find all employees
        Collection<Employee> emps = service.findAllEmployees();
        for (Employee e : emps)
        {
         System.out.println("Found Employee: " + e);
        }
            
        em.close();
        emf.close();
    }
}
最後,執行主程式看結果。

2014年10月12日 星期日

【筆記】一個可以在Java SE中運行的簡單JPA程式

啟動Derby DB後,連線到我們建立的資料庫後,執行下列語法來建立EMPLOYEE資料表:
CREATE TABLE APP.EMPLOYEE (
    ID INTEGER NOT NULL, 
    NAME VARCHAR(255), 
    SALARY INTEGER, 
    PRIMARY KEY (ID))

接著在Eclipse中建立一個hrServiceJava專案,專案中引入下列jar檔:
  • derbyclient.jar:在Glassfish安裝目錄/javadb/lib下可以找到
  • javax.persistence.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
  • org.eclipse.persistence.asm.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
  • org.eclipse.persistence.core.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
  • org.eclipse.persistence.jpa.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
  • org.eclipse.persistence.jpa.jpql.jar:在Glassfish安裝目錄/glassfish/modules下可以找到

再來在src下建立一個META-INF的資料夾,然後在其中建立一個persistence.xml的檔案:

    
        idv.jk.hr.entity.Employee
        NONE
  
            
            
            
            
        
    


下一步,建立idv.jk.hr.entity的套件,在其中新增一個EmployeeEntity
package idv.jk.hr.entity;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Employee 
{
 @Id
 private int id;
 private long salary;
 private String name;
 
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public long getSalary() {
  return salary;
 }
 public void setSalary(long salary) {
  this.salary = salary;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}
最後,寫一個簡單的程式來嘗試新增一個員工資料,新增一個idv.jk.hr.client的套件,在其中新增一個EmployeeMain的類別:
package idv.jk.hr.client;

import idv.jk.hr.entity.Employee;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EmployeeMain 
{
 public static void main(String[] args)
 {
  EntityManagerFactory emf = 
    Persistence.createEntityManagerFactory("HrService");
  EntityManager em = emf.createEntityManager();
  
  Employee emp = new Employee();
  emp.setId(168);
  emp.setSalary(100000);
  emp.setName("易路發");
  em.getTransaction().begin();
  em.persist(emp);
  em.getTransaction().commit();
 }
}

完成後,執行EmployeeMain這個類別,應該就可以在資料庫中的EMPLOYEE資料表中新增一筆資料。


完整的範例程式,可以在這裡下載

2014年10月11日 星期六

【筆記】在GlassFish中啟動Java DB

在安裝GlassFish後,內建有Derby DB,要啟動就使用GlassFish內建的指令即可。

先切換到GlassFish安裝目錄下的bin目錄,此例是以GlassFish4為主來做說明。
$ cd /Users/bioyang/glassfish4/glassfish/bin
在此目錄下,有一堆功能強大的指令,先找到asadmin這個指令後,執行:
$ ./asadmin start-database
這樣Derby DB就會開始啟動。

如果看到下列訊息,就表示Derby DB已經成功啟動。
Starting database in the background.
Log redirected to /Users/bioyang/glassfish4/glassfish/databases/derby.log.
Command start-database executed successfully.
再來使用Eclipse來進行連線,這裡是使用 Luna Release (4.4.0)Eclipse Java EE IDE for Web Developers

點按【Window】→【Open Perspective】,找到【Database Development】:



開啟【Data Source Explorer】後,在 【Database Connection】上點按滑鼠右鍵,再點按【New...】:



再來在【New Connection Profile】中,選擇【Derby】,然後在【Name】欄位中輸入Connection的名字,這是裡是「study」:



再來在下個對話窗中,在【Drivers】的右邊的【New Driver Definition】,如下方的紅框:


在跳出的對話窗中,先選擇【Derby Client JDBC Driver】且System Version為【10.2】這個,然後在下面的【Driver name】輸入要設定的名字,此例是「My Derby Client JDBC Driver」:


再來點按上方頁籤中間的【JAR List】後,再點選下方「Driver files」的「derbyclient.jar」,再點按右方的【Edit JAR/ZIP...】來指定正確的JAR位置:


可以在GlassFish安裝目錄下的javadb/lib中找到正確的derbyclient.jar,此例是位在「/Users/bioyang/glassfish4/javadb/lib」下。

按下【OK】後,再來進行資料庫名稱等設定:


此例中【Database】設定為「study_db」,【User name】和【Password】皆為「APP」,設定好後,可以先點按下方的【Test Connection】來測試連線,若出現「Ping succeeded」的對話窗,則表示連線設定成功,再來點按【Finish】完成設定。

回到【Data Source Explorer】後,可以看到剛才設定的連線已經生效,最後可以看到「study_db」的【APP】這個Schema,之後練習用的資料表,都會建立在這個Schema之下。