【问题标题】:Composite Primary Key Error复合主键错误
【发布时间】:2015-11-05 17:31:32
【问题描述】:

我想制作一张桌子,假设桌子的名字是 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;
  }

}

所以,我在谷歌上搜索并发现我可以使用@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]”。

所以我在实体类中为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的列在Embeddable类中,是否可以通过brandId找到。

  2. Entity 类中brandId 的setter getter 是否为真?

谢谢!

【问题讨论】:

    标签: java hibernate composite-id


    【解决方案1】:

    你有一个复合主键。见Compound Primary Keys

    【讨论】:

    • 我已经尝试像您提供的链接一样更改代码。但是,它不起作用。错误:“未找到超类型”。还有其他解决方案吗?
    • 既然你应该这样做,你可能做错了什么。建议您创建一个新问题,展示该尝试并寻求帮助。
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 2016-02-21
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多