2016-10-03 84 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可以正确地解释这一点,但是,是一个不同的问题。