2016-10-03 36 views
0

所以我想保存一個字段是Enum類型的數組集。休眠奇怪的行爲與設置<Enum[]>

基本上是: Set<Color[]>

現在,對於單枚舉我使用註釋

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

這工作好了,所以我試着使用

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

在我的領域,但我有一些奇怪的行爲。我在這裏只寫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 

一個潛在的解決辦法是使用,而不是陣列適當集合持有的顏色值。由於Collections應該提供equals,hashCode等的正確定義,因此它們可以嵌套。特別是,由於您使用枚舉常量的工作,您可以嘗試Java的內置EnumSet

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

,而不是

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

無論Hibernate可以正確地解釋這一點,但是,是一個不同的問題。