Java 映射旧模型-只有具有唯一约束的表才能用作域类?

Java 映射旧模型-只有具有唯一约束的表才能用作域类?,java,oracle,grails,gorm,Java,Oracle,Grails,Gorm,我试图映射一个只有唯一键的表(Oracle Forms time的遗留表),因为有些值可以为null。用户可以选择其他应用程序中的数据是否以char或number形式存在,并且该表有两个字段(一个varchar2和另一个number) 是否可以为此使用域类 范例 Mytable --------------------------------------------------------------- office_schedule_id NUMBER(5) NOT NULL o

我试图映射一个只有唯一键的表(Oracle Forms time的遗留表),因为有些值可以为null。用户可以选择其他应用程序中的数据是否以char或number形式存在,并且该表有两个字段(一个varchar2和另一个number)

是否可以为此使用域类

范例

Mytable
---------------------------------------------------------------
office_schedule_id        NUMBER(5) NOT NULL
office_company_char       VARCHAR2(6)
office_schedule_char      VARCHAR2(10)
office_company_num        NUMBER(6)
office_schedule_num       NUMBER(5)
default                   VARCHAR2(1)
唯一约束由除“默认”之外的所有字段组成

我试过这个:

class OfficeSchedule {
   int officeScheduleId
   String officeScheduleName

   static mapping = {
     version false
     table 'office_schedules'
     id column: 'office_schedule_id', name: 'officeScheduleId'
   }

   static hasMany = [ schedules : IntegrationSchedules ]
}
//this represents MyTable
class IntegrationSchedules {
    String officeCompanyChar
    String officeScheduleChar
    Integer officeCompanyNum
    Integer officeScheduleNum
    String default

    static belongsTo = [ officeSchedule : OfficeSchedule ]

    int hashCode() {
      def builder = new HashCodeBuilder()
      //added all fields of the unique key
      builder.toHashCode()
    }

    static mapping = {
      version false
      table 'mytable'
      id composite: ['officeSchedule','officeCompanyChar','officeScheduleChar','officeCompanyNum','officeScheduleNum']
      officeSchedule(column:'office_schedule_id')
    }

}
当我尝试查询时,56条记录中只有5条返回

println IntegrationSchedules.findAll().size() //prints 5 but table have 56
我试图删除与OfficeSchedule的关系,但仍然只返回五行

然后我注意到返回的行是因为它们通知了所有字段,这是有意义的,因为我将键定义为PK

我无法更改该表,因为有使用它的旧应用程序


我认为一种解决方法是将其转换为groovy bean,并使用服务创建对象,但有了这种方法,我无法使用criteria和GORM findBy方法。

您最好的办法是查看hibernate文档(并进行谷歌搜索),以找到一种机制,将其映射到普通hibernate中。一旦在hibernate中有了一个解决方案(hibernate非常努力地保持灵活性,以便可以在遗留数据库上使用),然后返回gorm并尝试确定gorm是否公开相同的功能。至少,它可能允许您构造一个邮件列表查询,该查询将生成本次查询没有的响应。有很多gorm没有很好的文档记录,因此了解gorm DSL如何映射到hibernate配置对于有根据地猜测如何在gorm中实现至关重要。

正如@ideascultor所提到的,我的解决方案是创建hibernate映射:

src/java/domain

@Entity
@Table(name = "mytable")
class IntegrationSchedules {
    @Id()
    @Type(type="string")
    @Column(name="rowid")
    private String rowid;
    private String officeCompanyChar
    private String officeScheduleChar
    private Integer officeCompanyNum
    private Integer officeScheduleNum
    private String default

    //getters & setters ommited
}
我必须创建一个hibernate配置(conf/hibernate中的hibernate.cfg.xml)


缺少约束块。这可能是个问题,因为如果没有字段,默认情况下字段不可为空。你能试着加一个吗?另外,如果office_schedule_id是唯一的,那么它可以单独作为您的PK。如果我没有弄错的话,那么这些约束只用于验证域类。在我的例子中,我只是从数据库中检索数据。唯一约束由除“default”之外的所有字段组成,因此我不能将office\u schedule\u id用作PK。
<!DOCTYPE hibernate-configuration SYSTEM
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <mapping package="domain" />
        <mapping class="domain.IntegrationSchedules" />
    </session-factory>
</hibernate-configuration>
IntegrationSchedules.findAll()