※使用XML設定
hibernate.cfg.xml
<hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property> <property name="hibernate.connection.username">account</property> <property name="hibernate.connection.password">password</property> <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.connection.autocommit">true</property> <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> <property name="hibernate.current_session_context_class">thread</property> <mapping resource="vo/Emp.hbm.xml" /> </session-factory> </hibernate-configuration>
Emp.hbm.xml
<hibernate-mapping> <class name="vo.Emp" table="Emp"> <id name="empno" type="int"> <column name="EMPNO" /> <generator class="assigned" /> </id> <property name="ename" type="java.lang.String"> <column name="ENAME" /> </property> <property name="job" type="java.lang.String"> <column name="JOB" /> </property> <property name="mgr" type="java.lang.Integer"> <column name="MGR" /> </property> <property name="hiredate" type="java.util.Date"> <column name="HIREDATE" /> </property> <property name="sal" type="java.lang.Double"> <column name="SAL" /> </property> <property name="comm" type="java.lang.Double"> <column name="COMM" /> </property> <property name="deptno" type="java.lang.Integer"> <column name="DEPTNO" /> </property> </class> </hibernate-mapping>
Emp.java
private int empno; private String ename; private String job; private Integer mgr; private Date hiredate; private Double sal; private Double comm; private Integer deptno; //setter/getter
DAOFactory.java
public class DAOFactory {
public static IEmpDAO getIEmpDAOInstance() {
return new EmpDAOImpl() ;
}
}
IEmpDAO.java
public interface IEmpDAO {
public boolean saveOrUpdate(Emp vo) throws Exception;
public boolean delete(int id) throws Exception;
public Emp load(int id) throws Exception;
}
EmpDAOImpl.java
public class EmpDAOImpl implements IEmpDAO {
@Override
public boolean saveOrUpdate(Emp vo) throws Exception {
// 使用官方的HibernateUtil
Transaction tx = HibernateUtil.getSessionFactory().getCurrentSession()
.beginTransaction();
HibernateUtil.getSessionFactory().getCurrentSession().saveOrUpdate(vo);
tx.commit();
// 使用自定的 HibernateUtil
// HibernateUtil2.getSession().saveOrUpdate(vo);
// HibernateUtil2.getSession().flush();
return true;
}
@Override
public boolean delete(int id) throws Exception {
// 使用官方的HibernateUtil
Transaction tx = HibernateUtil.getSessionFactory().getCurrentSession()
.beginTransaction();
HibernateUtil.getSessionFactory().getCurrentSession()
.delete(this.load(id));
tx.commit();
// 使用自定的 HibernateUtil
// HibernateUtil2.getSession().delete(this.load(id));
// HibernateUtil2.getSession().flush();
return true;
}
@Override
public Emp load(int id) throws Exception {
// 使用官方的HibernateUtil
HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
return (Emp) HibernateUtil.getSessionFactory().getCurrentSession()
.load(Emp.class, id);
// 使用自定的 HibernateUtil
// return (Emp) HibernateUtil2.getSession().load(Emp.class, id);
}
}
IEmpServiceTest
public class IEmpServiceTest {
// @Test
public void testSaveOrUpdate() throws Exception {
Emp emp = new Emp();
emp.setEmpno(1);
emp.setEname("bruce");
emp.setJob("IT");
emp.setMgr(7839);
emp.setHiredate(new Date());
emp.setSal(20000.35);
emp.setComm(251.13);
emp.setDeptno(20);
boolean rtn = DAOFactory.getIEmpDAOInstance().saveOrUpdate(emp);
TestCase.assertEquals(rtn, true);
}
@Test
public void testDelete() throws Exception {
boolean rtn = DAOFactory.getIEmpDAOInstance().delete(1);
TestCase.assertEquals(rtn, true);
}
// @Test
public void testLoad() throws Exception {
Emp emp = DAOFactory.getIEmpDAOInstance().load(1);
TestCase.assertEquals(emp != null, true);
}
@After
public void testCloseSession() {
if (HibernateUtil2.getSession().isOpen()) {
System.out.println("session2 未關閉!");
HibernateUtil2.getSession().close();
} else {
System.out.println("session2 已關閉!");
}
if (HibernateUtil.getSessionFactory().getCurrentSession().isOpen()) {
System.out.println("session 未關閉!");
HibernateUtil.getSessionFactory().close();
} else {
System.out.println("session 已關閉!");
}
}
}
這一次的專案圖:
※HibernateUtil和HibernateUtil2,依照IEmpServiceTest.java的測試,看起來都是使用同一個session
※使用官方的HibernateUtil一定要beginTransaction(查詢也要),最後也要commit(查詢可不用)
※使用自定的HibernateUtil只要flush即可
※使用Annotation設定
將xml設定的hibernate.cfg.xml改成下面的樣子<!-- <mapping resource="vo/Dept.hbm.xml" /> --> <mapping class="vo.Emp" />
Emp.java
package vo;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "EMP", catalog = "c##scott") //, schema = "c##scott")
public class Emp {
private int empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Double sal;
private Double comm;
private Integer deptno;
@Id
@Column(name = "EMPNO", unique = true, nullable = false)
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
@Column(name = "ENAME")
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
@Column(name = "JOB")
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Column(name = "MGR")
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "HIREDATE")
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
@Column(name = "SAL")
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
@Column(name = "COMM")
public Double getComm() {
return comm;
}
public void setComm(Double comm) {
this.comm = comm;
}
@Column(name = "DEPTNO")
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
}
※注意不要import錯了,都是import javax.persistence開頭的哦!
※@Table的catalog和schema全不打或取其一是ok的,但全打會出「could not load an entity:」的錯
※@Temporal(TemporalType.TIMESTAMP)是預設值可不打,其他還有兩種
TemporalType.DATE和TemporalType.TIME,主要就是取得的日期要不要有「年月日」,或是「時分秒」,或者兩個都要(預設)
※@Column預設是屬性名,而資料庫不分大小寫,如果兩個一樣可不寫

沒有留言:
張貼留言