映射遗留模型 - 只有唯一约束的表可以用作域类吗?

时间:2012-05-11 19:27:26

标签: java oracle grails gorm

我正在尝试映射只有Unique Key的表(来自Oracle Forms时间的遗留系统),因为某些值可能为null。用户可以选择其他应用程序中的数据是以char还是数字存在,并且该表具有两个字段(一个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方法。

2 个答案:

答案 0 :(得分:1)

你最好的办法是浏览一下hibernate docs(并进行谷歌搜索),寻找一种机制来在普通的hibernate中映射它。一旦你有了一个hibernate的解决方案(并且hibernate需要相当大的灵活才能灵活使用它可以在遗留数据库中使用),然后回到gorm并尝试确定gorm是否公开了相同的功能。至少,它可能允许您构建一个邮件列表查询,该查询将生成响应,而不会生成响应。有很多内容没有详细记录,因此了解gorm DSL如何映射到休眠配置对于如何在gorm中进行有根据的猜测是至关重要的

答案 1 :(得分:0)

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

的src /爪哇/域

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

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