2015-09-02 1 views
0

Возможно, я смешиваю термины, но то, что я называю простой сущностью, - это что-то вроде Customer или Product, т. Е. Вещь, имеющая свою личность и для которой я использую Integer id.Hibernate скомпонованный объект

Сложная сущность - это что-то вроде CustomerProduct, что позволяет создавать отображение m: n и связывать некоторые данные с ним. Я создал

class CustomerProduct extends MyCompositeEntity { 
    @Id @ManyToOne private Customer; 
    @Id @ManyToOne private Product; 
    private String someString; 
    private int someInt; 
} 

, и я получаю сообщение

класс Композит-идентификатор должен реализовывать Serializable

, которые приводят меня непосредственно к этим twoquestions. Я мог бы реализовать Serializable, но это означало бы сериализовать Customer и Product как часть CustomerProduct, и это не имеет для меня никакого смысла. Мне нужен составной ключ, содержащий два Integer, так же как обычный ключ - всего один Integer.

Есть ли у меня трек?

Если нет, как я могу указать это, используя только аннотации (и/или код)?

ответ

2

Объекты сеанса Hibernate должны быть сериализуемыми, это означает, что все объекты, на которые делается ссылка, также должны быть сериализуемыми. Даже если вы использовали примитивные типы в виде составного ключа, вам нужно добавить шаг сериализации.

Вы можете использовать составной первичный ключ в Hibernate с аннотациями @EmbeddedId или @IdClass.

С IdClass вы можете сделать follwing (предполагая, что ваши объекты используют целые ключи):

public class CustomerProduckKey implements Serializable { 
    private int customerId; 
    private int productId; 

    // constructor, getters and setters 
    // hashCode and equals 
} 

@Entity 
@IdClass(CustomerProduckKey.class) 
class CustomerProduct extends MyCompositeEntity { // MyCompositeEntity implements Serializable 
    @Id private int customerId; 
    @Id private int productId; 

    private String someString; 
    private int someInt; 
} 

Вы первичный ключ класс должен быть открытым и должен иметь публичный нет-арг конструктор. Он также должен быть serializable.

Вы также можете использовать @EmbeddedId и @Embeddable, что немного яснее и позволяет повторно использовать ПК в другом месте.

@Embeddable 
public class CustomerProduckKey implements Serializable { 
    private int customerId; 
    private int productId; 
    //... 
} 

@Entity 
class CustomerProduct extends MyCompositeEntity { 
    @EmbeddedId CustomerProduckKey customerProductKey; 

    private String someString; 
    private int someInt; 
} 
0

Вы можете использовать @EmbeddedId и @MapsId:

@Embeddable 
public class CustomerProductPK implements Serializable { 
    private Integer customerId; 
    private Integer productId; 
    //... 
} 

@Entity 
class CustomerProduct { 
    @EmbeddedId 
    CustomerProductPK customerProductPK; 

    @MapsId("customerId") 
    @ManyToOne 
    private Customer; 

    @MapsId("productId") 
    @ManyToOne 
    private Product; 

    private String someString; 
    private int someInt; 
}