Grails领域约束映射到PostgreSQL吉斯特约束

问题描述:

我有一个PostgreSQL表Grails领域约束映射到PostgreSQL吉斯特约束

CREATE TABLE reservation_table (
    idreservation   SERIAL NOT NULL, 
    entry_datetime  TIMESTAMPTZ NOT NULL DEFAULT 'NOW', 
    start_end_dates  DATERANGE NOT NULL , 
    property_id   INT NOT NULL REFERENCES property_table, 
... 
) 

和约束,以防止2只保留了相同的属性上同日

ALTER TABLE ONLY reservation_table 
    ADD CONSTRAINT reservation_double_booking_constraint 
    EXCLUDE USING gist 
    (property_id WITH =, start_end_dates WITH &&) 
; 

我能执行我的SQL约束在我的Grails Reservation域中?

我正在考虑使用视图,以避免在常规

create view resView as 
     select idReservation, 
      lower(start_end_dates) AS startDate, 
      upper(start_end_dates) AS endDate, 
      property_id 
     from reservation_table 
+0

你的意思是你想要将视图映射到你的域而不是表? – danielad 2014-10-04 11:30:24

+0

我想要一个简单,易于维护的域。范围类型尚未得到完全支持 - 因此,使用具有开始日期和结束日期的视图简化了我的Grails代码,同时允许我的数据库约束来防止通过另一个应用程序输入的双重预订公寓。这是我的第一个Web应用程序,所以我仍然在学习hibernate/grails约束是否可以执行。我希望有人能够指向我在grails/hibernate中的GIST样式约束机制 - 但我还没有找到。 – 2014-10-05 11:38:35

好PostgreSQL的范围问题访问预约,但你指定的最起码的信息来解决这样的问题,因为我还没有完全理解它,我有以下建议。

如何在grails上使用拦截器之前和之后。

class Reservation { 

    Date startDate ... 

    def beforeInterceptor = { 

    //do some date validation here start data or end date 
    //for exmaple you might check that we have 
    //any start date currently existing on db 
    //by findbyStartDate or endDate 
    //then reject the reservation or saving of this model 
     println "validation error here , cancel save" 
    } 
    static constraints = { 
     //do some validation here related to ur constraint 
     startDate max: new Date() 
    } 
    } 

让我知道任何事情,如果你需要更多的帮助。 。 。

+0

Postgresql daterange包含开始日期和结束日期。 postgresql约束可防止范围与现有预留(对于相同属性)重叠的预留插入。我正在寻找一个常规约束 - 而不是异步代码。 – 2014-09-30 10:07:40

+0

https://github.com/kaleidos/grails-postgresql-extensions postgresql范围仍在开发中。我将根据标准的开始和结束日期来实现一个简单的预留域。域约束重复数据库约束,违反干(不要重复自己) – 2014-10-01 12:17:11

+0

老兄很高兴它为你工作! – danielad 2014-10-06 14:00:53