public class CustomRequestProcessor
extends RequestProcessor {
protected boolean processPreprocess (
HttpServletRequest request,
HttpServletResponse response) {
HttpSession session = request.getSession(false);
//If user is trying to access login page
// then don't check
if( request.getServletPath().equals("/loginInput.do")
|| request.getServletPath().equals("/login.do") )
return true;
//Check if userName attribute is there is session.
//If so, it means user has allready logged in
if( session != null &&
session.getAttribute("userName") != null)
return true;
else{
try{
//If no redirect user to login Page
request.getRequestDispatcher
("/Login.jsp").forward(request,response);
}catch(Exception ex){
}
}
return false;
}
}
相應的,在struts-config.xml中加入controller元素
<controller>
<set-property property="processorClass"
value="com.sample.util.CustomRequestProcessor"/>
</controller>
但剛才看到在Struts1.3中,已經不再使用RequestProcessor,而是用ComposableRequestProcessor 來實現自定義的request響應。
@Entity @Table(name= "tc", catalog="first_hiber") public class Tc { @org.hibernate.annotations.CollectionOfElements @JoinTable(name="tc_tracer", joinColumns=@JoinColumn(name="tc_id")) private Set<TcTracer> tcTracers = new HashSet<TcTracer>(); @Id @GeneratedValue @Column(name="tc_id", nullable= false) private Long id; }
@Embeddable @Table(name="tc_tracer") public class TcTracer { @org.hibernate.annotations.Parent private Tc tc;
@ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="tracer_id", nullable=false, updatable=false) private Tracer tracer; @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="track_id", nullable=false, updatable=false) private Track track; }
如上,將TcTracer作為Tc的子元素,從而實現Tc的三相關聯。
用HQL可以通過特定的Tc,Tracer得到對應的所有Track:
select tctracers.track from Tc tc join tc.tcTracers tctracers where tc.name="tc name" and tctracers.tracer.name="tracer name"
List<Track> tracks = session.createQuery(HQL).list();
起初以為是override hashCode()的方法不對。后來google查了查多數問題都出現在detached對象之后,再鏈接session由于對象的改變而出現的異常。
最后發現原來問題很簡單....是在用annotation重寫mapping的時候,忘記給@Id加上@GeneratedValue,導致第一個row insert后,再次insert時沒有生成新的id!
看來annotation雖然方便了mapping,但由于和代碼集中在一塊了,很容易出現疏忽大意的錯誤,而且一般都不會注意到-.-
想起了python的SQLObject, SQLAlchemy,雖然功能沒有Hibernate豐富,但是簡單實用!
persion.getAddresses().add(address);
address.getPersons().add(person);
但對Hibernate而已,上面的代碼會被轉化為兩條insert語句,
為了避免這樣的情況出現需要定義inverse屬性,告訴Hibernate persion和address之間的關系:
// !file: Person.class public class Person { // ... @ManyToMany( targetEntity= Address.class, cascade = CascadeType.ALL, ) @JoinTable( name="persion_address", joinColumns= {@JoinColumn(name="person_id")}, inverseJoinColumns= {@JoinColumn(name="address_id")} ) private Set<Address> adressses = new HashSet<Address> (0); // ... }
// !file: Address.class public class Address { // ... @ManyToMany( targetEntity= Persion.class, cascade = CascadeType.ALL, mappedBy = "addresses" ) private Set<Person> persons = new HashSet<Person>(); // ... }
上面的兩個annotation告訴Hibernate,Person是主,對Address中persons屬性的修改將不會產生SQL語句。
Hibernate里,如果是Many-to-many的關系,可以任意設置主class。
通常,還可以將添加刪除關系的代碼包裝起來:
// !file: Person.class public class Person { // ... public void addAddress(Address address) { this.getAddresses().add(address); address.getPersons().add(this); } public void removeAddress(Address address) { this.getAddresses().remove(address); address.getPersons().remove(this); } //... }
差不多把平時用的上的讀完了,真感覺受益匪淺。不但詳細的介紹了Hibernate的特性用法,而且其中介紹的ORM基本概念,灌輸的ORM的思想也正是我所需要的。
對一個新手來說,business key, surrogate key, entity type, value type, transient, persistent, detached, persistence context...這些是什么概念,為什么要提出來,以及怎樣實現的在書中都會有簡單明了的解釋。
不多說了,現在把書放出來,誰看誰知道;)
實際上使用Hibernate自帶的工具hbm2ddl,建立根據你的對象建立數據庫是很愜意的一件事;)
首先當然要建好POJO object, XML Mapping File(也可以使用工具根據POJO class建立),配置文件(hibernate.cfg.xml)
然后運行下面的Java代碼
import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport;再看看數據庫,表是不是已經幫你建好了,對于我這樣不熟悉數據庫的人真是太方便了
public class SchemaUtil {
public static void main(String[] args) {
Configuration cfg = new Configuration().configure(); SchemaExport schemaExport= new SchemaExport(cfg); schemaExport.create(false, true); } }
決定花幾天時間好好的讀讀這本書,系統的學習Hibernate。
以設置為UTF-8為例,可以用如下方法解決。
1. 對于程序文件的編碼
直接在Eclipse或者其他IDE,editor中將文件編碼設為UTF-8即可。
2.輸出頁面
對于JSP頁面,加入以下代碼
<%@ page contentType="text/html; charset=UTF-8"%>
如果在IE或者Firefox中還不能正常顯示,還可以在Html標識下加入下面的頭信息
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
3. 響應到服務器端
我使用的是Tomcat,沒有可以直接設置接受響應編碼的方法(真是太佩服了!),但可以通過寫一個Filter實現編碼轉化。
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class SetCharacterEncodingFilter implements Filter { protected String encoding = null; protected FilterConfig filterConfig = null; protected boolean ignore = true; public void destroy() { this.encoding = null; this.filterConfig = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (ignore || (request.getCharacterEncoding() == null)) { String encoding = selectEncoding(request); if (encoding != null) request.setCharacterEncoding(encoding); } chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); String value = filterConfig.getInitParameter("ignore"); if (value == null) this.ignore = true; else if (value.equalsIgnoreCase("true")) this.ignore = true; else if (value.equalsIgnoreCase("yes")) this.ignore = true; else this.ignore = false; } protected String selectEncoding(ServletRequest request) { return (this.encoding); } }
將SetCharacterEncodingFilter放到程序的編譯目錄下,再在web.xml中添加相應屬性
<filter> <filter-name>Set Character Encoding</filter-name> <filter-class>hijeff.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Tomcat就會將用戶通過HTTP響應的字符轉化為UTF-8的編碼了