Hibernate / JPA:是否可以覆盖@Id字段?

时间:2013-11-14 15:39:33

标签: java hibernate jpa

是否有一种方法在将子实体分配给父实体中的某个字段后重新分配子实体中的@Id

例如:

@MappedSuperclass
@Access(AccessType.FIELD)
public abstract class Parent implements Serializable {

  @Id
  protected Integer parentId;

  public Integer getId() {
    return parentId;
  }

  public void setId(Integer id) {
    this.id = parentId;
  }
}


@Entity
@Access(AccessType.FIELD)
public class Child extends Parent implements Serializable {

  /*
   What should be added to this entity to re assign the @Id to a new field and 
   make the parentId field just an ordianry field in the Child, not the entity Id
  */
  @Id
  private Long childId;

}

我尝试使用@AttributeOverride,但它可以提供的是重命名id列名称。

2 个答案:

答案 0 :(得分:3)

这听起来像是一个设计问题。

实现这一目标的正确方法可能是定义另一个类:@MappedSuperclass GenericEntity,除Parent以外的所有属性parentId

@MappedSuperclass
@Access(AccessType.FIELD)
public abstract class GenericEntity implements Serializable {
     ... all your common attributes without parentId
}

@MappedSuperclass
public abstract class Parent extends GenericEntity implements Serializable {

    @Id
    protected Integer parentId;

    public Integer getId() {
        return parentId;
    }

    public void setId(Integer id) {
        this.id = parentId;
    }

    //nothing more in this class
}

@Entity
public class Child extends GenericEntity implements Serializable {

   @Id
   private Long childId;

   private Integer parentId; //if you need it

   ...
}    

另一种实验性解决方案可以隐藏parentId类中的Child字段。

免责声明:我不推荐这种方法,我不确定它会起作用!

@Entity
@Access(AccessType.FIELD)
public class Child extends GenericEntity implements Serializable {

   @Id
   private Long childId;

   private Integer parentId;

   ...
}    

答案 1 :(得分:0)

您可以通过xml覆盖注释元数据: 对于休眠,参见例如this post

对于一般JPA,请参阅例如this post