使用 Hibernate 设置与数据库无关的默认列时间戳

发布于 2024-09-04 08:32:38 字数 753 浏览 12 评论 0原文

我正在开发一个充满 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

扭转时空 2024-09-11 08:32:38

您可以尝试以下操作(没有生成,因为您的数据库没有生成该值):

<column  name="DATE_CREATED" sql-type="timestamp"  default="CURRENT_TIMESTAMP"/>

Could you try the following (without generated since your database is not generating the value):

<column  name="DATE_CREATED" sql-type="timestamp"  default="CURRENT_TIMESTAMP"/>
夏九 2024-09-11 08:32:38

您是否尝试过使用 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" or generated="always".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文