0

私はgrailsアプリケーションを実行していますが、おそらくこれまでに遭遇した中で最も奇妙なエラーを受け取ります。モデル内の1つの「フィールド」は、理由もなく消えるだけのデータを取得しました。

プロジェクトに2つのModelクラスまたはDomainクラスがあり、次のように設定されています。

class Insertion {

String title
Date insertDate

static hasMany = Dataholder

  static constraints = {
    title(unique: true)
  }
}



class Dataholder {

    String product
    int somenumber
    int somenumber2
    int somenumber3
    Date startDate
    Date endDate
    List<String> somedatalist
    Insertion insertions

    static belongsTo = Insertion

    static constraints = {
    }
}

「挿入」クラスは、ユーザーが一連のデータホルダーを入力するたびに表されます。データホルダーは、その特定の製品のすべてのデータを表します。知っておくべき重要なことは、消えるデータはデータホルダーモデルに含まれており、消えるデータは。だけであるということsomedatalistです。

これは、データを挿入して保存するときに完全に混乱する魔法です。それはすべてうまくいきます:

if (!errors) {

            dataholderValidator.each {
                it.insertion = insertion
                it.save()
            }

        def results = Dataholder.findAllByInsertion(insertion)

検証を行い、すべてのデータホルダーにデータを適用します。すべてがうまくいけば、if(!errors)各オブジェクトに挿入を追加します。その後、各オブジェクトを保存し、データをデータベースに保存します。ここではうまくいかないと思うかもしれませんが、ただ待って驚いてください。

保存後、挿入を使用して、データベースからすべてのデータホルダーを取得します(データをユーザーに印刷する前に、データが保存されていることを確認したいため)。これは奇妙な部分が始まるところです、私が返すのは正しいデータです:

results.each {
                it.somedatalist.each { it2 ->
                    if(!weekdays.contains(it2))
                        weekdays.add(it2)
                }
            }

データリストのすべての一意のアイテムを配列に入力します。次に、それをビューと出来上がりに印刷します。

正しいデータのあるビュー

ここで、ユーザーがビュー内のすべてのデータを確認するのを待つだけです。ユーザーが確認ボタンをクリックすると、挿入タイトルがpost to functionとともに送信され、データが取得されます。驚いたことに、これsomedatalistはnullです。

これは、データを取得する機能です。

    def result = Insertion.findByTitle(insertionTitle)

    def results = Dataholder.findAllByInsertions(result)

後にブレークポイントを置くとき、私は確かに、に等しいものを除いて、すべてが正しい正しいデータを含んresultsでいることを確認することができます。Dataholdersomedatalistnull

オブジェクトを使用するだけでなく、挿入タイトルを使用して上記のデータを取得しようとしましたが、うまく機能します。データが1秒でデータベースに入力される理由と、何かが消えてしまう理由がわかりません。

テスト:

void testSaveDataholder() {
        Insertions insertion = new Insertion(title: 'adadad', insertDate: new Date())
        insertion.save()
        assert Insertion.all.size() == 1
        Dataholder ed = new Dataholder(product:  'abc123', somenumber:  123, somenumber2: 13, startDate: new Date(), endDate: new Date(), somedatalist: ['TI'], insertions:  insertion)
        ed.save()
        assert Dataholder.all.size() == 1
        assert Dataholder.all.first().somedatalist.size() == 1
        assert Dataholder.all.first().insertions.title == 'adadad'
        assert Insertion.findAllByTitle('adadad').size() == 1
        assert Dataholder.findAllByInsertions(Insertion.all.first()).size() == 1
    }

このテストはすべてtrueを返します。私は、Grails2.1を使用しています。

編集:構成として「更新」を使用してインメモリデータベースを使用しています。そのため、実際にデータを表示することはできません。しかし、それはそこにあるはずです。

あなたの賢者のアドバイスとより良い知恵で私を助けてください。

4

1 に答える 1

3

頭に浮かんだばかりです。オブジェクトのコレクションを単一の列に永続化すると、第1正規形が壊れるため、これを行う正しい方法ではありません。私はすぐにJIRAの問題をグーグルで検索しました:

http://jira.grails.org/browse/GRAILS-1023

正しい方法は、単一の文字列属性を持つ新しいドメインクラスを作成し、標準の1対多の関係を使用することです。

于 2012-09-06T08:58:02.403 に答える