复合主键错误

时间:2015-11-05 17:31:32

标签: java hibernate composite-id

我想制作一张桌子,让我们说桌子的名字是Car。它将包含3列,brandIdtypeIdsizeId。我希望所有列都是主键typeIdsizeId是来自不同表格的列。我已经尝试创建代码,但如果我为每列使用注释@Id,则会出现错误"找不到超类型"。

代码如下。

@Entity
@Table(name = "CAR")
public class Car implements Serializable {
  private static final long serialVersionUID = -1576946068763487642L;

  @Id
  @Column(name = "BRAND_ID", nullable = false, length = 20)
  private String brandId;

  @Id
  @ManyToOne
  @JoinColumn(name = "TYPE_ID", nullable = false)
  private TypeId typeId;

  @Id
  @ManyToOne
  @JoinColumn(name = "SIZE_ID", nullable = false)
  private SizeId sizeId;



  public String getBrandId() {
      return brandId;
  }

  public void setBrandId(String brandId) {
      this.brandId= brandId;
  }


  public TypeId getTypeId() {
      return typeId;
  }

  public void setTypeId (TypeId typeId) {
      this.typeId= typeId;
  }


  public SizeId getSizeId() {
      return sizeId;
  }

  public void setSizeId (SizeId sizeId) {
      this.sizeId= sizeId;
  }

}

所以,我正在使用Google搜索并发现我可以使用@EmbeddedId来创建复合主键。实体的代码是这样的:

@Entity
@Table(name = "CAR")
public class Car implements Serializable {
  private static final long serialVersionUID = -1576946068763487642L;

  @EmbeddedId
  private CarPk carPk;


  public CarPk getCarPk () {
      return carPk ;
  }

  public void setCarPk (CarPk carPk ) {
      this.carPk = carPk ;
  }

}

和Embeddable类:

@Embeddable
public class CarPk implements Serializable {
  private static final long serialVersionUID = -83738833L;


  @Column(name = "BRAND_ID", nullable = false, length = 20)
  private String brandId;


  @ManyToOne
  @JoinColumn(name = "TYPE_ID", nullable = false)
  private TypeId typeId;


  @ManyToOne
  @JoinColumn(name = "SIZE_ID", nullable = false)
  private SizeId sizeId;

  public String getBrandId() {
      return brandId;
  }

  public void setBrandId(String brandId) {
      this.brandId= brandId;
  }


  public TypeId getTypeId() {
      return typeId;
  }

  public void setTypeId (TypeId typeId) {
      this.typeId= typeId;
  }


  public SizeId getSizeId() {
      return sizeId;
  }

  public void setSizeId (SizeId sizeId) {
      this.sizeId= sizeId;
  }
}

然后,我想基于brandId创建可以找到列的界面。 接口代码:

public interface CardDao extends PagingAndSortingRepository<Car, Long>, QueryDslPredicateExecutor<Car> {
     public Car findByBrandId(String brandId);
}

不幸的是,代码是错误的:

  

&#34;无法根据路径&#34;解析属性[brandId]。

所以我在Entity类中为brandId创建了setter getter:``

@Entity
@Table(name = "CAR")
public class Car implements Serializable {
  private static final long serialVersionUID = -1576946068763487642L;

  @EmbeddedId
  private CarPk carPk;


  public CarPk getCarPk () {
      return carPk ;
  }

  public void setCarPk (CarPk carPk ) {
      this.carPk = carPk ;
  }

  public brandId getBrandId (){
      return carPk.getBrandId();
  }

  public void setBrandId (String brandId){
      this.carPk.setBrandId(brandId);
  }
}

错误未显示,但表格的车辆数据也不会出现。

我的问题是:

  1. 接口代码是否为真?我想知道在brandId类中,当brandId的列在Embeddable时,brandId是否可以找到它。

  2. 实体类中array[0] = [1, 2, 3, 4] array[1] = [2, 3, 4, 5] array[2] = [3, 4, 6, 10, 15, 20] array[3] = [15, 20, 25] 的setter getter是真的吗?

  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

您有一个复合主键。请参阅Compound Primary Keys