我可能会混淆术语,但我称之为简单实体的东西就像Customer
或Product
,即具有自己身份的东西,我正在使用{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
,但这意味着将Customer
和Product
序列化为CustomerProduct
的一部分,这对我来说毫无意义。我需要的是一个包含两个Integer
的复合键,就像普通键只有一个Integer
一样。
我是否离开赛道?
如果没有,我如何仅使用注释(和/或代码)来指定它?
答案 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;
}