Hibernate 4: ¿Qué debería reemplazar a @MapKey en desuso para asignar una colección de mapas mientras Key es un tipo de usuario de Hibernate personalizado?

Considerando las siguientes dos tablas:

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

En originalhibernate-3.2.2, elbidireccional uno a muchos la relación funciona bien:

@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...
}

Lo que hacehibernate La migración de 3.2.2 a 4.3.11 difícil es el tipo de usuario disfrazadoAttributeKeyHbm como una clave deattributes enUserHbm

AttributeKeyHbm es un UserType disfrazado de Hibernate, que contiene dos columnas deUserAttributeHbm, name ylocal respectivamente.

Desde la anotación de hibernación@MapKey esobsoleto, He intentado usar las siguientes anotaciones una por una, para reemplazar el original@MapKey:

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

Pero todo termina con estas excepciones:

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

Entonces mis preguntas son:

Cómo implementar la misma función enUserHbm conhibernate-4.3.11, Dado queAttributeKeyHbm no se pudo abandonar porque ya está siendo utilizado por otra API en gran medida.ComoAttributeKeyHbm tiene dos columnas, ¿es correcto o suficiente para implementar la interfaz?UserType en lugar deCompositeUserType

Respuestas a la pregunta(1)

Su respuesta a la pregunta