2016-08-30 11 views
1

fixedSteve EbersoleこれはHibernate 5.2.3に含まれています。あなたが以前のバージョンで立ち往生しているなら、私は答えとして回避策を追加します。ElementCollectionの埋め込みデータの名前を変更

私は、次の作業の設定があります:あなたが見ることができるように

Embeddable(読みやすくするために削除定型)

@Embeddable 
public class TypeValue { 
    String type; 

    @Column(columnDefinition = "TEXT") 
    String value; 
} 

Entity(定型読みやすくするために削除)

@Entity 
public class AggregatedTypeValue { 
    @Id 
    UUID id; 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name = "type", column = @Column(name = "content_type")), 
     @AttributeOverride(name = "value", column = @Column(name = "content_value")) 
    }) 
    TypeValue content; 

    @ElementCollection(fetch = FetchType.EAGER) 
    @MapKeyColumn(name = "attribute_name") 
    Map<String, TypeValue> attributes; 
} 

を私はMapKeyColumnを使用して、マップのキーが格納されている列の名前を変更しました。これは問題なく動作します。ただし、Embaddableに使用されている列の名前を変更することもできます。

@ElementCollection(fetch = FetchType.EAGER) 
@AttributeOverrides({ 
    @AttributeOverride(name = "value.type", column = @Column(name = "attribute_type")), 
    @AttributeOverride(name = "value.value", column = @Column(name = "attribute_value")) 
}) 
@MapKeyColumn(name = "attribute_name") 
Map<String, TypeValue> attributes; 

しかし、これは正しく

  • 格納する列名前が変更され、コレクションテーブルの

    1. 型と値になり:私はこれがAttributeOverrideを使用して可能であるべき見つけたものから

      キーの名前は「値」(MapKeyColumnは無視されます)

    2. 追加の「ハッシュ」列が格納され、これがプライマリキーと明らかにキーのhashCodeへの呼び出しの結果です。

    これに応じて列の名前を変更する方法はありますか?

    編集 すると、私は休止状態5.2.2.Final

  • +0

    FWIWコードは問題なく、仕様に従います。 MapKeyColumnはサポートされている必要があり、実装によって追加された永続的な列はもう存在しません。おそらくバグとして報告する –

    +1

    これはすでに報告されているバグです:https://hibernate.atlassian.net/browse/HHH-8630 –

    +0

    素晴らしい、ありがとう! – Mene

    答えて

    0

    を使用しています、これはSteve Ebersoleにより速やかfixedだった、それが休止状態5.2.3に含まれています。以前のバージョンに慣れていない場合は、ここで回避策として行ったことがあります。

    私は新しいEmbeddable

    @Embeddable 
    public class AttributeName { 
        String name; 
    } 
    

    とキーとして使用追加しました:

    @ElementCollection(fetch = FetchType.LAZY) 
    @AttributeOverrides({ 
         @AttributeOverride(name = "key.name", column = @Column(name = "attribute_name", nullable = false)), 
         @AttributeOverride(name = "value.type", column = @Column(name = "attribute_type", nullable = false)), 
         @AttributeOverride(name = "value.value", column = @Column(name = "attribute_value", nullable = false)) 
    }) 
    Map<AttributeName, TypeValue> attributes; 
    

    予想通り、この作品を、しかし、それはまた、あなたが実際のキーにアクセスする必要がありますことを意味し異なって(例えばkey.getName())、あなたが望むものではないかもしれません。

    関連する問題