Hibernate 4 - Что должно заменить устаревший @MapKey для сопоставления коллекции Map, в то время как Key является настраиваемым Hibernate UserType

Учитывая следующие две таблицы:

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

В оригиналеhibernate-3.2.2,двунаправленный один ко многим отношения работают нормально:

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

Что делаетhibernate переход с 3.2.2 на 4.3.11 сложен в костюмированном UserTypeAttributeKeyHbm как ключattributes вUserHbm

AttributeKeyHbm это костюмированный пользовательский тип Hibernate, содержащий два столбца изUserAttributeHbm, name а такжеlocal соответственно.

Так как спящая аннотация@MapKey являетсяосуждаетсяЯ пытался использовать следующие аннотации одну за другой, чтобы заменить оригинал@MapKey:

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

Но все заканчивается этими исключениями:

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

Итак, мои вопросы:

Как реализовать ту же функцию вUserHbm сhibernate-4.3.11, При условииAttributeKeyHbm не может быть оставлено, потому что он уже интенсивно используется другим API.КакAttributeKeyHbm имеет два столбца, это правильно или достаточно для реализации интерфейсаUserType вместоCompositeUserType

Ответы на вопрос(1)

Ваш ответ на вопрос