使用 Hibernate 设置与数据库无关的默认列时间戳
我正在开发一个充满 Hibernate (3.3.1) 映射文件的 java 项目,这些文件对大多数域对象都有以下类型的声明。
<property name="dateCreated" generated="insert">
<column name="date_created" default="getdate()" />
</property>
这里的问题是 getdate() 是 MSSQL 特定的函数,当我使用 H2 之类的东西来测试项目的子部分时,H2 尖叫着这
getdate()
不是一个可识别的函数。它自己的时间戳功能是
current_timestamp().
我希望能够继续使用H2进行测试,并且想知道是否有一种方法告诉Hibernate“使用这个数据库自己的机制来检索当前时间戳”。对于 H2,我提出了以下解决方案。
CREATE ALIAS getdate AS $$ java.util.Date now() { return new java.util.Date(); } $$;
CALL getdate();
它可以工作,但显然是 H2 特定的。
我尝试扩展 H2Dialect 并注册函数 getdate(),但是当 Hibernate 创建表时似乎不会调用该函数。是否可以从特定数据库引擎中抽象出默认时间戳的概念?
I'm working on a java project full of Hibernate (3.3.1) mapping files that have the following sort of declaration for most domain objects.
<property name="dateCreated" generated="insert">
<column name="date_created" default="getdate()" />
</property>
The problem here is that getdate() is an MSSQL specific function, and when I'm using something like H2 to test subsections of the project, H2 screams that
getdate()
isn't a recognized function. It's own timestamping function is
current_timestamp().
I'd like to be able to keep working with H2 for testing, and wanted to know whether there was a way of telling Hibernate "use this database's own mechanism for retrieving the current timestamp". With H2, I've come up with the following solution.
CREATE ALIAS getdate AS $ java.util.Date now() { return new java.util.Date(); } $;
CALL getdate();
It works, but is obviously H2 specific.
I've tried extending H2Dialect and registering the function getdate(), but that doesn't seem to be invoked when Hibernate is creating tables. Is it possible to abstract the idea of a default timestamp away from the specific database engine?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以尝试以下操作(没有
生成
,因为您的数据库没有生成该值):Could you try the following (without
generated
since your database is not generating the value):您是否尝试过使用 a < code>映射 在您的
中?文档不是很清楚,但听起来这应该会导致映射一个值为时间戳的列。
您可以指定 Hibernate 是否应使用 通过设置
generated="insert" 或
generated="always" 数据库生成值
。
Have you tried using a
<timestamp>
mapping inside your<class>
?The docs aren't very clear but it sounds like this should result in mapping a column whose value is a timestamp.
You can specify if Hibernate should use a database generated value by setting either
generated="insert"
orgenerated="always"
.