2012-10-04 36 views
14

我正在研究將支持多個數據庫引擎(Oracle,MSSQL,MySQL)的產品。對於Oracle,我寧願使用Sequences而不使用Sequence表來避免潛在的併發性和鎖定高容量安裝的問題,但其他數據庫引擎不支持序列。此外,我寧願每個表使用一個序列而不是全局序列(例如hibernate_sequence),因此@GeneratedValue(strategy = GenerationType.AUTO)將不起作用。有沒有辦法在運行時動態選擇策略?有沒有辦法使用JPA批註和Hibernate動態選擇@GeneratedValue策略?

回答

22

實際上,Hibernate使用其org.hibernate.id.enhanced.SequenceStyleGenerator來解釋GenerationType.AUTOGenerationType.SEQUENCE。 SequenceStyleGenerator是一種id生成策略,可根據底層數據庫支持的兩種策略選擇其中一種策略。如果數據庫支持序列,SequenceStyleGenerator使用序列;如果沒有,SequenceStyleGenerator會回退到使用「序列表」。要使用的發電機的「映射」由設置hibernate.id.new_generator_mappings控制。將其設置爲true將啓用上面剛剛描述的行爲。不幸的是,出於向後兼容的原因,我們必須將其默認爲false。所以要利用這一點,你需要確保設置設置爲true。

此外,如果沒有給出名稱,您可以配置SequenceStyleGenerator以選擇全局序列或每個實體的序列。這由一個名爲prefer_sequence_per_entity

的設置控制。SequenceStyleGenerator通常可以很好地配置。看看它的javadocs的更多信息:http://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/SequenceStyleGenerator.html

+0

它是如何配置的,我還沒有找到一個如何更改SequenceStyleGenerator的increment_size的例子? 傳遞給configure方法的參數是cfg.xml中設置的屬性的有限集合。優化器和increment_size不會傳遞給我的最大努力。 –

+2

'@SequenceGenerator(...,allocationSize = blah)' –

+0

感謝您的建議。但是它似乎是一個快捷方式,因爲SequenceGenerator沒有SequenceStyleGenerator中提到的相同的配置屬性。 我試過這個,它與Pooled Optimizer一起工作,它給了我期待的性能優勢。 但爲了關閉。有沒有辦法在cfg.xml文件中做到這一點。在調試時,SequenceStyleGenerator.java上的「optimizer」和「increment_size」沒有被hibernate讀取。 http://stackoverflow.com/questions/19694154/hibernate-cfg-xml-configuration-for-sequence-generator –

相關問題