Hibernate 4 - O que deve substituir o @MapKey reprovado para mapear uma coleção de Mapas enquanto Key é um UserType personalizado do Hibernate

Considerando as duas tabelas a seguir:

| User      | UserAttribute     |
|---------- |-------------------|
| userId(PK)| attributeId(PK)   |
| firstName | userId            |
| lastName  | name              |
| other     | locale            |
| active    | value             |

No originalhibernate-3.2.2, aum para muitos bidirecional relacionamento funciona bem:

@Entity
@Table(name = "User")
public class UserHbm {

    @Id
    @GeneratedValue(generator = "id-generator")
    @Column(name = "userId")
    private long id;

    @Column
    private String firstName;

    @Column
    private String lastName;

    @Column
    private String other;

    @Column
    private boolean active = true;

    @OneToMany (mappedBy = "user", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
    @MapKey(columns = { @Column(name = "name"), @Column(name = "locale") })
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private Map<AttributeKeyHbm, UserAttributeHbm> attributes = null;

    //other methods, getter & setting, etc...
}
@Entity
@Table(name = "UserAttribute")
public class UserAttributeHbm {

    @Id
    @GeneratedValue(generator = "id-generator")
    @Column(name="attributeId")
    private long id;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
    @JoinColumn(name="userId")
    private UserHbm user;

    @Column
    private String name;

    @Column
    private Locale locale = Locale.ENGLISH;

    @Column
    private String value;

    // other methods...
}
public class AttributeKeyHbm implements UserType {

    protected static int[] SQL_TYPES = { Types.VARCHAR, Types.VARCHAR };

    private String name;

    private Locale locale;

    public AttributeKeyHbm(String name, Locale locale) {
        this.name = name;
        this.locale = locale;
    }

    //other override methods, assemble, deepCopy & nullSafeGet, etc...
}

O que faz ohibernate migração de 3.2.2 para 4.3.11 difícil é o UserType fantasiadoAttributeKeyHbm como uma chave deattributes noUserHbm

AttributeKeyHbm é um UserType fantasiado de Hibernate, contendo duas colunas deUserAttributeHbm, name elocal respectivamente.

Desde a anotação de hibernação@MapKey édescontinuada, Tentei usar as seguintes anotações, uma por uma, para substituir a original@MapKey:

@MapKeyType(value=@Type(type="com.xxx.xxx.AttributeKeyHbm"))
@MapKeyJoinColumns(value={ @MapKeyJoinColumn(name = "name"),  @MapKeyJoinColumn(name = "locale")})
@MapKeyJoinColumn(name = "AttributeKeyHbm")

Mas tudo acaba com essas exceções:

org.hibernate.MappingException: collection index mapping has wrong number of columns: com.xxx.xxx.UserHbm.attributes type: com.xxx.xxx.AttributeKeyHbm

Então, minhas perguntas são:

Como implementar a mesma função noUserHbm comhibernate-4.3.11, dado queAttributeKeyHbm não pôde ser abandonado porque já é usado por outra API fortemente.ComoAttributeKeyHbm possui duas colunas, é correto ou suficiente para implementar a interfaceUserType ao invés deCompositeUserType

questionAnswers(1)

yourAnswerToTheQuestion