0

我正在尝试映射一个只有唯一键的表(Oracle Forms 时代的旧版),因为某些值可以为空。用户可以选择其他应用程序中的数据是否以 char 或 number 形式存在,并且表具有两个字段(一个 varchar2 和其他数字)。

可以为此使用域类吗?

例子

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)

唯一约束由除“default”之外的所有字段组成。

我试过这个:

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 并使用服务来创建对象,但是我不能使用标准和 GORM findBy 方法。

4

2 回答 2

1

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

于 2012-05-12T20:08:03.913 回答
0

正如@ideasculptor 所提到的,我的解决方案是创建一个休眠映射:

src/java/域

@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
}

我必须创建一个休眠配置(conf/hibernate 中的 hibernate.cfg.xml)

<!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>

有趣的是 GORM 的动态方法有效,例如:

IntegrationSchedules.findAll()
于 2012-05-31T12:38:30.577 回答