我想做一张桌子,让我们假设桌子的名字是汽车。它将有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);
}不幸的是,代码是错误的:
“无法根据路径解析属性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);
}
}错误不会出现,但是表的car的数据也不会出现。
我的问题是:
brandId类中时,我想知道是否可以通过Embeddable找到它。brandId的setter是否为true?谢谢!
发布于 2015-11-05 17:45:45
你有一个复合主键。见复合主键。
https://stackoverflow.com/questions/33551071
复制相似问题