Составная ошибка первичного ключа
Я хочу сделать стол, скажем, имя стола - Автомобиль. Будет 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);
}
}
Ошибка не появляется, но данные автомобиля таблицы тоже не появляются.
Мой вопрос:
Является ли код интерфейса верным? Интересно, можно ли найти по
brandId
когда столбец brandId находится вEmbeddable
учебный класс.Является ли сеттер-геттер для
brandId
в сущности класса это правда?
Спасибо!