Google Code Prettify

顯示具有 Oracle 標籤的文章。 顯示所有文章
顯示具有 Oracle 標籤的文章。 顯示所有文章

2016年4月19日 星期二

JPA: 新增含 SEQUENCE 欄位的資料

接繼上一篇 (Hibernate + Spring + JPA (configure)),之前只說明到怎麼查詢,這裡將說明新增資料的方法。假設有如下的 table:

最後一個欄位 ID 是序號,由 1 開始每次會自動加 1,因為我的資料庫是使用 Oracle,需要在 Oracle 新增一個 SEQUENCE,方法如下:
CREATE SEQUENCE  "STEVEN"."SQ_LOGINLOG"  MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE;
Java 的 Entity 如下宣告,注意兩件事:
  1. Oracle 自動產生序號時,GenerationType 要用 SEQUENCE (綠色)。
  2. sequenceName (紅色) 和資料庫中的 SEQUENCE 名稱要一樣,表示要使用剛剛建立的那一個 SEQUENCE。
@Entity
public class LoginLog implements Serializable {
    private String emNo;
    private Date loginTime;
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sq_loginlog")
    @SequenceGenerator(name="sq_loginlog", sequenceName="SQ_LOGINLOG", allocationSize=1)
    private Long id;
    
    public String getEmNo() {
        return emNo;
    }
    public void setEmNo(String emNo) {
        this.emNo = emNo;
    }
    public Date getLoginTime() {
        return loginTime;
    }
    public void setLoginTime(Date loginTime) {
        this.loginTime = loginTime;
    }
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}
DAO 的寫法如下,注意以下幾點:
  1. EntityManager 在查詢時可以直接使用 spring 設定檔中的 bean,在 insert、update、delete 時不可以! 必須每次重新由 EntityManagerFactory 中建立一個新的。
  2. 建立 EntityManagerFactory 時,persistence 的名稱要用 persistence.xml 中的 persistence-unit 的名稱 (參看上一篇)。 
@Repository
public class LoginLogDaoImpl implements LoginLogDao {
    @Autowired
    private LoginLog dto;
    
    @Override
    public int save(String emNo, Date loginTime) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit");
        EntityManager entityManager = factory.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        
        transaction.begin();
        dto.setEmNo(emNo);
        dto.setLoginTime(loginTime);
        
        entityManager.persist(dto);
        transaction.commit();
        
        entityManager.close();
        
        return 1;
    }
}



2016年2月11日 星期四

Oracle 亂碼1/2

在 Oracle 中明明 insert 的是中文,select 出來卻是亂碼,為什麼? 通常的是因 client 端和 server 端的編碼不一致造成的! 解決的辦法很簡單:
  1. 在 client 和 server 都執行如下指令
  2. select userenv('language') from dual;
    這樣可以查出編碼 (charset),得到的結果可能如下:
     TRADITIONAL CHINESE_TAIWAN.AL32UTF8
    重點在後面的編碼 (紅色部份),確認兩邊不一致,那麼就確定是編碼不一致造成亂碼的!
  3. 在 client 新增一個環境變數 NLS_LANG,值設定為 server 端查到的 charset,例如:
  4. NLS_LANG = AL32UTF8
    重啟 client 端的軟體 (或許是 toad or sql developer),再查詢一次,應該已經可以正常顯示。