Hibernate中的复合键

时间:2014-08-18 17:51:52

标签: java hibernate

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();

1 个答案:

答案 0 :(得分:0)

实际上有两种方法可以指定复合键,一种是@EmbeddedId,另一种是ID类:@IdClass。这是一个非常好的教程,向您展示了如何处理两种复合键说明符样式的选项并提供了建议:http://www.objectdb.com/java/jpa/entity/id

我没有亲眼看到主键类使用该键嵌入到类中,但是如果不需要在其他任何地方使用键类,那么它是有意义的。公共静态嵌套类与根级别类基本相同,它只显示该类与其封闭类紧密关联的意图。

至于创建类的实例,我认为大多数示例都是通过构造函数来完成的。在尝试将实体持久保存到数据库之前,显然必须为主键组件提供值。这是一个典型的例子:http://www.java2s.com/Tutorial/Java/0355__JPA/EmbeddedCompoundPrimaryKey.htm