1.Update & Cascade
1).One-Many, One-One時使用了Cascade-Persistence,保存Object的時候可以同時保存引用的Object。
2)只在One-One并且關系非常緊密的時候使用Cascade-Update。One-Many則盡量不使用Cascade-Update。【一個 Detached的數據到底是不已經修改了Container應該是需要比較每一個Field之后才能确定,因此数据多了还是会影响效率。】
3)One-One時只設置單向的Cascade-Update,尽量减少双向的Cascade-Update,例如可以在Update User的時候Cascade-Update PlayerSession,而不在Update PlayerSession的時候Update Player.
4)在使用API時也需要注意這一點,通過Update"主"Object同時來保存引用的Object,如果沒有使用Cascade的Object需要單獨去Update或Persistent。
2. EhCache & Collections
1).二級緩存適用于更新大大小與讀取的數據,Reference少的數據,數據量小的數據。
2)Account類似"關鍵數據"不使用Cache
3)Collections如果不緩存其中的Object那么緩存的只是Collections里面的對象的ID,不能緩存這些對象,只有緩存了這些對象才能緩存Collections中的Object。
4)Collections里面的任何一個對象修改了都會引起Collections里面的重新讀取。
5)SlotMachine里緩存了Room以及相關配置的數據和Table的數據,Table的數據修改也相對頻繁,是不是適合緩存需要進一步驗證。
6)大数据量的Collections使用的时候一定要注意这一点。
3.生成SQL
1)openjpa提供了生成sql的插件,命令行執行如下:mvn org.codehaus.mojo:openjpa-maven-plugin:1.0:sql
2) openjpa生成的mysql 缺省InnoDb, Hibernate生成的mysql表缺省為MyISAM。
3)Foreign Key在測試環境不很需要加上,因為經常要清理數據,如果加上而沒有Cascade的話可能刪不掉任何一條數據。
4)在SlotMachine的數據庫里沒有加上任何Foreign Key。因為在生產環境中的任何數據都不应该刪除。
4.關于Enhance
1)openjpa提供的enhance命令:
在pom.xml里配置maven-antrun-plugin,設置:org.apache.openjpa.enhance.PCEnhancer
mvn org.apache.maven.plugins:maven-antrun-plugin:1.3:run install
2)也可以用org.codehaus.mojo插件進行Enhance
3)OpenJPA Enhance以后可以顯著提高性能
4)OpenJPA在Enhance以后不認識SQL里面的Class定義了?例如沒Enhance以前"Select p from Player p"可以執行而在Enhance以后就不認識了,或者是Enhance的方法不對出問題了。
5.Hibernate JPA & SubClass
Hibernate對SubClass的處理在LazyLoading的時候有問題,会提示ClassCastException,可以通过Deproxy来解决这个问题。
http://forum.hibernate.org/viewtopic.php?t=962876
6.JTA & JTS
1)Hibernate JPA ON Glassfish:
需要在persistence.xml里增加:
7.OpenJPA & Hibernate JPA
1)兩者都可以在在運行時進行Enhance,但OpenJPA對不同的Application Server需要配置不同的LoadTimeWeaver,Hibernate適應能力比較強,不需要配置單獨的LoadTimeWeaver,只需要設 置Hibernate VenderAdaptor就可以了。
2)OpenJPA對Entity的使用方法要求更嚴格,例如:只要get***他都會Warn,認為是一個屬性,設置了Access Method的方法,引用Field的地方都要求使用get/set方法。
3)Hibernate Provider很大的優勢就是Hibernate和Cache結合的比較好,但這好像不是Hibernate JPA Provider本身的優勢。
8.Spring
Spring可以通過PersistenceUnitManager配置使用的Persistence.xml,并制定Multiple Persistence.xml,并制定所有需要在Persistence.xml里設置的Property
可以直接注入EntityManager或者注入EntityManagerFactory,通過EntityManagerFactory得到EntityManager。
問題:
1. 當有多個EntityManagerFactory的時候Spring是怎么知道該用哪一個EntityManager的?
2. 當使用多個Persistence的時候如果類重復會出問題?例如:MyAccount這個應用中同時有百家樂和SlotMachine如果在同一個 SpringContext實例中就會需要load很多相同的對象就會警告已經Load了相同的對象。但現在Myaccount中百家樂是在單獨的一個 SpringContext中因此暫時沒有問題。 8.Access Field/Trigger
Class && Sub Class需要使用相同的Access Field,很多人喜歡用AccessField,但OpenJPA給出的警告太多了。在SlotMachine里使用了AccessFiled + Triger【pre-persistence, pre-update, post-load】
9.性能
1)在OO的環境里看起來非常合理的事情對數據庫的效率來說好像不是很OK,例如:Player引用了Session那么每次保存的時候都需要保存一次Player,實際上Player的基礎數據并沒有任何变化,不过這與JPA本身無關。
2)Collection的使用可能會引起的很大的性能問題,這也與JPA本身無關,慎重使用太大的Collection。