Java Persistence with Hibernate显示了如何创建复合键:
@Entity
@Table(name = "CATEGORIZED_ITEM")
public class CategorizedItem {
@Embeddable
public static class Id implements Serializable {
@Column(name = "CATEGORY_ID")
private Long categoryId;
@Column(name = "ITEM_ID")
private Long itemId;
public Id() {}
public Id(Long categoryId, Long itemId) {
this.categoryId = categoryId;
this.itemId = itemId;
}
public boolean equals(Object o) {
if (o != null && o instanceof Id) {
Id that = (Id)o;
return this.categoryId.equals(that.categoryId) &&
this.itemId.equals(that.itemId);
} else {
return false;
}
}
public int hashCode() {
return categoryId.hashCode() + itemId.hashCode();
}
}
@EmbeddedId
private Id id = new Id();
@Column(name = "ADDED_BY_USER")
private String username;
@Column(name = "ADDED_ON")
private Date dateAdded = new Date();
制作复合键时,是否使Id
静态变得常见?如果是这样,为什么?
为什么有必要在Id
中实例化CategorizedItem
?
private Id id = new Id();
答案 0 :(得分:0)
实际上有两种方法可以指定复合键,一种是@EmbeddedId
,另一种是ID类:@IdClass
。这是一个非常好的教程,向您展示了如何处理两种复合键说明符样式的选项并提供了建议:http://www.objectdb.com/java/jpa/entity/id
我没有亲眼看到主键类使用该键嵌入到类中,但是如果不需要在其他任何地方使用键类,那么它是有意义的。公共静态嵌套类与根级别类基本相同,它只显示该类与其封闭类紧密关联的意图。
至于创建类的实例,我认为大多数示例都是通过构造函数来完成的。在尝试将实体持久保存到数据库之前,显然必须为主键组件提供值。这是一个典型的例子:http://www.java2s.com/Tutorial/Java/0355__JPA/EmbeddedCompoundPrimaryKey.htm