4

オブジェクトを保存したいときにこの問題が発生します

私の顧客

String firstName
String lastName
LocalDate dateOfBirth
CountryCode nationality

私の国コード

  @Audited
class CountryCode implements Serializable {

  String code
  String symbolA2
  String symbolA3
  String countryName

  static constraints = {
    code size:3..3, unique: true, matches: '[0-9]+'
    symbolA2 size:2..2, nullable: false, unique: true, matches: '[A-Z]+'
    symbolA3 size:3..3, nullable: false, unique: true, matches: '[A-Z]+'
    countryName size:1..50
  }

  static mapping = {
    id generator: 'assigned', name: 'code'
  }

  def beforeValidate() {
    symbolA2 = symbolA2?.toUpperCase()
    symbolA3 = symbolA3?.toUpperCase()
  }

  @Override
  String toString() {
    return countryName
  }
}

オブジェクトを保存しようとすると、このエラーが表示されます

クラス org.hibernate.TransientObjectException メッセージ オブジェクトが保存されていない一時インスタンスを参照しています - フラッシュする前に一時インスタンスを保存します: lookup.iso.CountryCode

これを修正する方法についてのアイデアはありますか?

ありがとう

4

2 に答える 2

2

エラーの具体的な理由は、Customer に割り当てる前に CountryCode を保存していないためです。そのため、Hibernate (Grails の基になる ORM) はそれを一時的と見なします。基本的に、GORM 関係 (has*、belongsTo など) は定義されていません。GORM 関係を定義することにより、関係の定義方法に応じてカスケード保存/削除を行うことができます。

単純に hasOne または belongsTo をそれぞれ Customer および CountryCode に追加する前に、CountryCode をどのように使用しているかを検討することをお勧めします。CountryCode は次のように使用されますか:

  1. 多くの Customer が特定の CountryCode にマップされる可能性がある 1 対多のルックアップ/参照/辞書エンティティ
  2. 顧客ごとに一意の CountryCode がある 1 対 1 の一意のエンティティ

belongsTo#1 を実装するには、次のようにin CountryCode なしin hasOneCustomerを使用して、単方向の関係のみを定義する必要があります。

class CountryCode {
  static belongsTo = [customer: Customer]
  ...
}

これにより、特定の CountryCode (基本的には 1 対多) を参照する Customer テーブルに外部キーが作成されます。

belongsTo#2 を実装するには、次のようにin CountryCode WITH a hasOnein Customerを使用して双方向の関係を定義する必要があります。

class Customer {
  static hasOne = [country: CountryCode]
  ..
}
class CountryCode {
  static belongsTo = [customer: Customer]
  ..
}

これにより、CountryCode テーブルに特定の Customer に戻る外部キーが作成されます。基本的には 1 対 1 のマッピングです。

于 2013-04-16T13:37:43.013 に答える