0

2つの順序付けられたコレクションの1対多のフィールドを同じ値にマップしようとしています。フィールドにはさまざまなフィルタリング要件があります。したがって、一方のフィールドには、もう一方のフィールドから除外されたアイテムが含まれます。

これがエンティティの関連部分です。

public class OptionValueSet extends ConfigurationDomainObject {
    ...

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = OPTION_VALUE_SET_ID_COLUMN, nullable = false)
    @IndexColumn(name = "option_index", nullable = false)
    @Where(clause = OBSOLETE_FILTER)
    private final List<OptionValue> allOptions = new java.util.ArrayList<OptionValue>();

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = OPTION_VALUE_SET_ID_COLUMN, nullable = false, insertable = false, updatable = false)
    @IndexColumn(name = "option_index", nullable = false)
    @Where(clause = OBSOLETE_FILTER + " AND disabled = '0'")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @Immutable
    private final List<OptionValue> options = new java.util.ArrayList<OptionValue>();

    ...
}

そして例外

原因:org.hibernate.MappingException:エンティティのマッピングで繰り返される列:com.casenet.domain.configuration.screen.OptionValue列:option_value_set_id(insert = "false" update = "false"でマッピングする必要があります)
    org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:670)で
    org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:692)で
    org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:714)で
    org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:468)で
    org.hibernate.mapping.RootClass.validate(RootClass.java:215)で
    org.hibernate.cfg.Configuration.validate(Configuration.java:1135)で
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320)で
    org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)で
    org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)で
    ...137詳細

不思議なことに、私は同じ休止状態のフィールドを使用している2つのユースケースを解きほぐしているところです。現在、フィルターは無効になっているOptionValuesを非表示にするために一方でオンになっており、それらを編集するためにもう一方でオンのままになっています。ただし、@Filterアノテーションはキャッシュを妨害しています。基になるDBスキーマを変更せずにこれを修正する必要があります。リリースサイクルが遅すぎて、もっと過激なことをすることはできません。

4

2 に答える 2

1

これらのコレクションはとにかく熱心にフェッチされるので、フィルターされたビュー(またはコピー)を返すgetOptions()メソッドを追加してみませんallOptionsか?

public List<OptionValue> getOptions() {
    List<OptionValue> result = new ArrayList<OptionValue>(allOptions.size());
    for (OptionValue o : allOptions) {
        if (!o.isDisabled()) {
            result.add(o);
        }
    }
    return result;
}
于 2012-05-24T15:22:59.200 に答える
0

hibernateのアイデアでは、同じフィールドを2回マップしました(この場合は子リストです。単純なプロパティを2回マップすると、同じエラーメッセージが表示されます)。更新または挿入後に状態が無効になる可能性があるため、Hibernateはそれを処理できません(2回マップされたオブジェクトがJavaコードで更新用に異なる値を取得した場合、Hibernateはどうすればよいですか?)。

2つのフィールドの1つが読み取り専用である場合は、フィールドを2回マップできます。単純なプロパティの場合、エラーメッセージはすでに実行方法を示しています(insert="false" update="false")。子リストの場合、おそらく読み取り専用プロパティにも設定cascadeする必要があります。none

于 2012-05-24T15:33:25.453 に答える