0

一部の値がnullになる可能性があるため、一意キーのみを持つテーブル(Oracle Formsの時代からのレガシー)をマップしようとしています。ユーザーは、他のアプリケーションのデータがcharまたはnumberのどちらで存在し、テーブルに2つのフィールド(1つはvarchar2、もう1つは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との関係を削除しようとしましたが、それでも5行しか返されません。

そのとき、返される行はすべてのフィールドに通知されているためであることに気付きました。これは、キーをPKであるかのように定義しているため意味があります。

テーブルを使用するレガシーアプリケーションであるため、テーブルを変更できません。

回避策の1つは、これをGroovy Beanとして変換し、サービスを使用してオブジェクトを作成することですが、これでは、条件とGORMfindByメソッドを使用できません。

4

2 に答える 2

1

最善の策は、休止状態のドキュメントを調べて(そして、グーグル検索を実行して)、これをプレーンな休止状態にマッピングするメカニズムを探すことです。hibernateでソリューションを入手したら(そして、hibernateは、レガシーデータベースで使用できるように柔軟にするためにかなりの労力を要します)、gormに戻って、gormが同じ機能を公開するかどうかを判断してみてください。少なくとも、これでは生成されない応答を生成するメーリングリストクエリを作成できる場合があります。十分に文書化されていないgormが多数あるため、gorm DSLが休止状態の構成にどのようにマップされるかを理解することは、gormでどのように達成できるかについて知識に基づいた推測を行うために不可欠です。

于 2012-05-12T20:08:03.913 に答える
0

@ideasculptorが述べたように、私の解決策は休止状態のマッピングを作成することでした。

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)を作成する必要がありました

<!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 に答える