2016-10-03 8 views
0

私はEnum型の配列のセットであるフィールドを保存しようとしています。基本的にSet with Set <Enum[]>

Set<Color[]>

さて、単一列挙型のために私が使用した注釈大丈夫そう私は

@ElementCollection(targetClass = Color[].class, fetch = FetchType.EAGER) private Set<Color[]> availableColorCombinations;

を使用しようとした仕事を

@ElementCollection(targetClass = Color.class, fetch = FetchType.EAGER)

私のフィールドでは、私はいくつかの奇妙な行動をしました。私はここでの唯一の6つの値を書いている:

 colors.add(new Color[] {Color.CHROM, Color.CHROM}); 
     colors.add(new Color[] {Color.BIANCO, Color.WHITE}); 
     colors.add(new Color[] {Color.GOLD, Color.GOLD}); 
     colors.add(new Color[] {Color.NERO, Color.BLACK}); 
     colors.add(new Color[] {Color.BLACK, Color.BLACK}); 
     colors.add(new Color[] {Color.WHITE, Color.WHITE}); 

しかし、私のオブジェクト(私はデータベースからそれを取っているとき)と言い、私はこのセットで200以上の配列を持っていることを、この6つの値ですが、多くを追加しました、何度も。

これはどういう意味ですか、なぜそれが起こりますか?そして最も重要なのは、Set<Enum[]>をデータベースに保存する最良の方法は何ですか?

+0

[最小限の完全で検証可能な例](http://stackoverflow.com/help/mcve)を提供してください。 –

答えて

0

問題が配列の二つの配列abはまったく同じサイズと要素を持っている場合でも、すなわち、「深い」平等を実装していない、彼らは彼らのequals実装によって異なるものとして報告されていること、である、と非常に可能性が高いでしょう異なるハッシュコードを持っている:

a.equals(b) => false 

多くSet実装がその要素のオブジェクト平等のに適した定義に依存しますので、彼らはこれらの配列が異なるように考えるだろう。

観察し、どの

public class Dummy { 

    public static void main(String[] args) { 
     final Object[] a1 = new Object[] { "foo" }; 
     final Object[] a2 = new Object[] { "foo" }; 
     System.out.println(a1.equals(a2)); 
     System.out.println(a1.hashCode()); 
     System.out.println(a2.hashCode()); 
    } 
} 

する

false 
1342443276 
769287236 

一つの潜在的解決策は、色の値を保持するために適切なコレクションの代わりに配列を使用することで生成します。 Collectionは、equals,hashCodeなどの適切な定義を提供することになっているため、これらはネストすることができます。特に、あなたが列挙定数で作業しているので、あなたは内蔵のEnumSet Javaのを試してみてください可能性があります

EnumSet.of(Color.CHROM, Color.CHROM) 

代わりの

new Color[] {Color.CHROM, Color.CHROM} 

かどうかHibernateはこれを適切に解釈できるが、しかし、別の質問です。