首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合主键误差

复合主键误差
EN

Stack Overflow用户
提问于 2015-11-05 17:31:32
回答 1查看 469关注 0票数 0

我想做一张桌子,让我们假设桌子的名字是汽车。它将有3列,brandIdtypeIdsizeId。我希望所有的列都是主键。typeIdsizeId是来自不同表的列。我已经尝试编写代码,但是如果我对每一列使用注释@Id,错误将出现“没有找到超级类型”。

代码在下面。

代码语言:javascript
复制
@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创建复合主键。实体的代码如下:

代码语言:javascript
复制
@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 ;
  }

}

和可嵌入类:

代码语言:javascript
复制
@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的查找列的接口。接口代码:

代码语言:javascript
复制
public interface CardDao extends PagingAndSortingRepository<Car, Long>, QueryDslPredicateExecutor<Car> {
     public Car findByBrandId(String brandId);
}

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

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

因此,我在实体类中为brandId创建了setter getter :

代码语言:javascript
复制
@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);
  }
}

错误不会出现,但是表的car的数据也不会出现。

我的问题是:

  1. 接口代码是真的吗?当brandId的列在brandId类中时,我想知道是否可以通过Embeddable找到它。
  2. 实体类中用于brandId的setter是否为true?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-11-05 17:45:45

你有一个复合主键。见复合主键

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33551071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档