0

我想制作一张桌子,假设桌子的名字是 Car。它将有 3 列brandIdtypeIdsizeId。我希望所有的列都是主键typeId并且sizeId是来自不同表的列。我已经尝试编写代码,但是如果我@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;
  }

}

所以,我在谷歌搜索,发现我可以@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
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);
}

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

“无法根据路径解析属性 [brandId]”。

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

@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

  2. 实体类中的setter getterbrandId是真的吗?

谢谢!

4

1 回答 1

0

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

于 2015-11-05T17:45:45.573 回答