17

hibernate は LinkedHashSet の順序を保持しますか? もしそうなら、どのように? これがデータベースのタイプに依存する場合は、PostgreSQL について知りたいです。

バックグラウンド:

私は LinkedHashSet の目的を知っています。これを尋ねている理由は、実行するいくつかの関数の名前を、いくつかの 'functionName' テーブルと多対多の関係を持つ 'logError' テーブルに記録しているためです。 . これらの関数を実行時と同じ順序に保つ必要があるため、最初に対応する「functionName」オブジェクトを見つけ、それらを LinkedHashSet (失敗した各関数の後) に配置してから、「logError」オブジェクトを永続化します。

データベースから「logError」オブジェクトを再度取得した場合、それはまだ注文されますか? もしそうなら、これが Hibernate によってどのように行われるのか興味がありました。

4

3 に答える 3

16

まず、2つのエンティティ間の関係について話していると思います。何かのようなもの

@Entity
public class A {
@ManyToMany
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_fk") }, inverseJoinColumns = { @JoinColumn(name = "B_fk") })
    private Set<B> bSet = new LinkedHashSet<B>();
}

Hibernateはそれ自体では順序を保持しません!

Aエンティティがデータベースからロードされるときに使用されるクラスを見ると、Set bSetはタイプPersistentSetであり、これは別のラッパーのラッパーSetであり、これは(私の場合)通常のHashSetです。(HashSet要素の順序は保持されません。)

HibernateがListまたはLinkedHashSetを使用した場合でも、自然な(保証されていない)データベースの順序に基づいて実装を行うことはお勧めできません。MySQLの場合、これはある種のアンチパターンです。

ただし、@Sort注釈(org.hibernate.annotations.Sort)を使用して、並べ替えを明示的にすることができます。例えば:

@OneToMany(mappedBy = "as")
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class);
public SortedSet<C> cs;

@see:JPAクエリでの子オブジェクトの戻りの順序


2012年9月1日にŁukaszRzeszotarskiによって追加されました:

@Sortただし、アノテーションを使用すると、SQLではなくメモリ(jvm)でオブジェクトが並べ替えられることを覚えておく必要があります。代わり@OrderByに、SQLサーバー側で並べ替えを行うアノテーションを使用できます。これらの注釈は両方とも、私の(ŁukaszRzeszotarski)の意見では、デフォルトで順序付けを設定する1つの弱点があります。私(ŁukaszRzeszotarski)は、order by句が使用されていることを「確認」したときに、独自のLinkedHashSet実装を使用して休止状態にします。

@see:SQLでの休止状態の順序

于 2010-11-22T10:26:41.690 に答える
0

アイテムのリストの順序を保持する必要がある場合は、 ではMapなくを使用しListます。

@OneToMany(fetch = FetchType.EAGER, mappedBy = "rule", cascade = CascadeType.ALL)
@MapKey(name = "position")
private Map<Integer, RuleAction>    actions             = LazyMap.decorate(new LinkedHashMap<>(), FactoryUtils.instantiateFactory(RuleAction.class, new Class[] { Rule.class }, new Object[] { this }));

このJava例では、positionは の Integer プロパティであるRuleActionため、順序はそのように保持されます。私はC#これでかなり似ていると思います。

于 2014-12-25T19:09:28.547 に答える
0

セットには固有の「順序」がなく、データベース テーブルにもありません。データをクエリするときに順序を適用できますが、その順序を保持しない限り (たとえば、行を 1 つずつ取得し、それらをリンクされたような順序付けられたコンテナーに入れることによって) list) の場合、返されるデータも順不同になります。

于 2010-11-22T10:18:34.127 に答える