4

在将子实体分配给父实体中的某个字段后,是否有一种方法可以重新@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 列名。

4

2 回答 2

4

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

实现这一点的正确方法可能是定义另一个类 :具有除以下之外的@MappedSuperclass GenericEntity所有属性:ParentparentId

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

   ...
}    
于 2013-11-14T16:05:31.677 回答
0

您可以通过 xml 覆盖注释元数据:对于休眠,请参见例如这篇文章

对于一般 JPA,请参见例如这篇文章

于 2013-11-14T15:44:02.317 回答