Hibernate 4 - Was sollte veraltetes @MapKey ersetzen, um eine Kartensammlung zuzuordnen, während Key ein benutzerdefinierter Hibernate-Benutzertyp ist?

Betrachten Sie die folgenden beiden Tabellen:

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

In originalhibernate-3.2.2, das eins-zu-viele bidirektionale Beziehung funktioniert gut:

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

Was machthibernate Migration von 3.2.2 auf 4.3.11 schwierig ist der kostümierte UserTypeAttributeKeyHbm als Schlüssel vonattributes imUserHbm

AttributeKeyHbm ist ein kostümierter UserType von Hibernate, der zwei Spalten aus @ enthälUserAttributeHbm, name undlocal beziehungsweise

Seit Ruhezustand Annotation@MapKey ist veraltet, Ich habe versucht, die folgenden Anmerkungen einzeln zu verwenden, um das ursprüngliche @ zu ersetze@MapKey:

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

Aber alles endet mit diesen Ausnahmen:

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

Also meine Fragen sind:

Wie man die gleiche Funktion in @ implementieUserHbm mithibernate-4.3.11, daAttributeKeyHbm konnte nicht abgebrochen werden, da es bereits von einer anderen API verwendet wird.WieAttributeKeyHbm hat zwei Spalten, ist es richtig oder genug, um die Schnittstelle @ zu implementierUserType Anstatt vonCompositeUserType

Antworten auf die Frage(2)

Ihre Antwort auf die Frage