Составная ошибка первичного ключа

Я хочу сделать стол, скажем, имя стола - Автомобиль. Будет 3 колонки, brandId, typeId а также sizeId, Я хочу, чтобы все столбцы были первичными ключами. 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);
}

К сожалению, код ошибки:

Msgstr "Невозможно разрешить атрибут [brandId] против пути".

Так что я создаю сеттер геттер для brandId в классе Entity:``

@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. Является ли сеттер-геттер для brandId в сущности класса это правда?

Спасибо!

1 ответ

У вас есть составной первичный ключ. См. Составные первичные ключи.

Другие вопросы по тегам