2015-04-23 74 views
0
@Entity 
class MyEntity { 
} 

hibernate.hbm2ddl.auto=update 

MyEntity的表不存在時,hibernate是否可能生成CREATE unlogged TABLE語句而不是CREATE TABLE休眠可以自動生成一個未記錄的表嗎?

+0

你是什麼意思由CREATE unlogged TABLE ???? – Dev

+0

http://www.postgresql.org/docs/9.1/static/sql-createtable.html寫入未記錄表的數據不會寫入預寫日誌(請參閱第29章),這使得它們比普通錶快得多。 – membersound

+0

相關http://stackoverflow.com/questions/7938610/how-to-apply-postgresql-9-1-unlogged-feature-to-an-existing-table – isalgueiro

回答

0

您應該使用更新,而不是創造

這是有益的:

Hibernate hbm2ddl.auto default value

+0

抱歉,我當然要寫'update'。 – membersound

+1

那麼你的意思是未記錄的表格。 Hbm2dll自動更新將爲您創建那些在模式中不存在的表 – Nimesh

+0

寫入未記錄表的數據不會寫入預寫日誌(請參閱第29章),這使得它們比普通錶快得多。 \t postgresql.org/docs/9.1/static/sql-createtable.html – membersound

1

我想你可以通過繼承相關的Postgres方言和重寫getCreateTableString()方法如下做到這一點。

public class CustomPostgresSQLDialect extends PostgresSQLxxDialect{ 

    @Override 
    public String getCreateTableString() { 
     return "create unlogged table"; 
    } 
} 

很顯然它設置爲你的方言:

<property name="hibernate.dialect" value="org.foo.CustomPostgresSQLDialect "/> 
+0

這是一個好主意。無論如何,這將迫使我所有的表都成爲一個不記錄的表? (我只想定義一個具體的)。或者我可以將方言與明確的實體聯繫起來嗎? – membersound

+0

我沒有看到任何簡單的方法。如果你看看org.hibernate.mapping.Table.sqlCreateString(..)的來源,那麼你在這一點上有關於表/映射的信息,但顯然它不會被傳遞給上面的方法。 –

+0

另一個選項可能是重寫org.hibernate.cfg.Configuration/AnnotationConfiguration並後處理由generateSchemaCreationScript(...)或generateSchemeUpdateScript(...)返回的相關字符串。 –

1

我覺得有一個在@Entity@Table沒有參數去傳遞一種選項的DBMS。在hibernate的jira中發現了this feature request,它涵蓋了你的用例,也許你想爲它投票。

無論如何,你可以嘗試在hibernate配置中添加一個auxiliary database object來運行ALTER TABLE MyEntity SET UNLOGGED,這是我可以考慮做DDL修改的最簡單方法。