Java Tutorial 第五堂(1)使用 spring-orm 整合 Hibernate
|
Java Tutorial 第四堂(3)Hibernate 與 JPA << 前情 在先前的課程中,我們 使用 spring-webmvc 框架 建立簡單的 Web 應用程式,使用 spring 相依注入 中進行依賴物件之注入,而在 Hibernate 與 JPA 中,既然認識了 ORM,那麼就也來使用 spring-orm 將之整合起來至 使用 spring 相依注入 撰寫的 DVDLibrary 專案之中吧! 練習 14:使用 spring-orm這個練習要將練習 12 與練習 13 整合在一起。在 Lab 檔案的 exercises/exercise14 中有個 DVDLibrary 目錄,已經事先將練習 12 與練習 13 中一些可重用的程式碼(像是 Dvd.java、DvdDao.java 等)與設定檔(像是 build.gradle 等)準備好。 spring-orm 提到了 ...
<bean id="dataSource" class="org.hsqldb.jdbc.JDBCDataSource"
p:url="jdbc:hsqldb:file:src/main/resources/db/dvd_library"
p:user="codedata"
p:password="123456"/>
<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="tw.codedata" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="show_sql">true</prop>
<prop key="format_sql">true</prop>
</props>
</property>
</bean>
...
在這邊,透過 練習 13 中的 ...
Dvd dvd = new Dvd(title, year, duration, director);
getDvdDao().saveDvd(dvd);
m.addAttribute("dvd", dvd);
...
接下來你可能會打算將之改為: ...
DirectorDao directorDao = new DirectorDaoHibernateImpl(factory);
DvdDao dvdDao = new DvdDaoHibernateImpl(factory);
Director director = new Director("XD");
directorDao.saveDirector(director);
dvdDao.saveDvd(new Dvd("XD", 112, 1, director));
...
在 MVC 架構中,控制器應該是擔任請求轉發,而上頭的流程似乎混入了商務邏輯,也就是包括了 因此,建議建立一個新的商務物件來處理相關流程,例如若有個 package tw.codedata;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
public class DvdController {
private DvdLibraryService dvdLibraryService;
@Autowired
public void setDvdLibraryService(DvdLibraryService dvdLibraryService) {
this.dvdLibraryService = dvdLibraryService;
}
public DvdLibraryService getDvdLibraryService() {
return dvdLibraryService;
}
@RequestMapping("list")
public String list(Model m) {
m.addAttribute("dvds", getDvdLibraryService().allDvds());
return "list";
}
@RequestMapping("add")
public String add(
@RequestParam("title") String title,
@RequestParam("year") Integer year,
@RequestParam("duration") Integer duration,
@RequestParam("director") String director,
Model m) {
Dvd dvd = getDvdLibraryService().addDvd(title, year, duration, director);
m.addAttribute("dvd", dvd);
return "success";
}
}
以上也利用了 Spring 自動注入 package tw.codedata;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DvdLibraryService {
private DirectorDao directorDao;
private DvdDao dvdDao;
@Autowired
public void setDirectorDao(DirectorDao directorDao) {
this.directorDao = directorDao;
}
@Autowired
public void setDvdDao(DvdDao dvdDao) {
this.dvdDao = dvdDao;
}
public DirectorDao getDirectorDao() {
return directorDao;
}
public DvdDao getDvdDao() {
return dvdDao;
}
public List<Dvd> allDvds() {
return getDvdDao().allDvds();
}
public Dvd addDvd(String title, Integer year, Integer duration, String directorName) {
Director director = new Director(directorName);
getDirectorDao().saveDirector(director);
Dvd dvd = new Dvd(title, year, duration, director);
getDvdDao().saveDvd(dvd);
return dvd;
}
}
為了讓 Spring 可以自動在 package tw.codedata;
import com.google.common.base.Optional;
import java.util.List;
import org.hibernate.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DirectorDaoHibernateImpl implements DirectorDao {
private SessionFactory sessionFactory;
@Autowired
public DirectorDaoHibernateImpl(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
...
其中 package tw.codedata;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DvdDaoHibernateImpl implements DvdDao {
private SessionFactory sessionFactory;
@Autowired
public DvdDaoHibernateImpl(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
...
接下來就可以使用 org.gradle.jvmargs=-XX:MaxPermSize=256m |

Java 學習之路




