Hibernate组成的实体

时间:2015-09-02 23:13:27

标签: java hibernate jpa jpa-2.1

我可能会混淆术语,但我称之为简单实体的东西就像CustomerProduct,即具有自己身份的东西,我正在使用{Integer id 1}}。

组合实体类似于CustomerProduct,允许创建m:n映射并将某些数据与其关联。我创建了

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

我正在收到消息

  

Composite-id类必须实现Serializable

引导我直接访问这些two questions。我很容易实现Serializable,但这意味着将CustomerProduct序列化为CustomerProduct的一部分,这对我来说毫无意义。我需要的是一个包含两个Integer的复合键,就像普通键只有一个Integer一样。

我是否离开赛道?

如果没有,我如何仅使用注释(和/或代码)来指定它?

2 个答案:

答案 0 :(得分:2)

Hibernate会话对象需要是可序列化的,这意味着所有引用的对象也必须是可序列化的。即使您使用基本类型作为复合键,也需要添加序列化步骤。

您可以在Hibernate中使用带有注释@EmbeddedId@IdClass的复合主键。

使用IdClass,您可以执行以下操作(假设您的实体使用整数键):

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,这有点清晰,并允许您在其他地方重复使用PK。

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

答案 1 :(得分: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;
}