[英]Use the external key as part of primary key with Hibernate annotation
I have a one-to-many
relationship between Car
and DatatableProgress
, so one car
may have more DatatableProgress
but one DatatableProgress
element is of one car
. 我与Car
和DatatableProgress
之间存在one-to-many
关系,因此一辆car
可能具有更多的DatatableProgress
但其中一个DatatableProgress
元素属于一辆car
。 Car
has idCar
as primary key, datatableProgress
has datatableName
and sheet
as primary key, but I have to add idCar
(the foreign key) as part of primary key. Car
将idCar
作为主键, datatableProgress
将datatableName
和sheet
作为主键,但是我必须添加idCar
(外键)作为主键的一部分。 I tryed with this code but I received mappedBy reference an unknown target entity property: com.domain.DatatableProgress.car in com.domain.Car.datatablesProgress
. 我尝试使用此代码,但收到mappedBy reference an unknown target entity property: com.domain.DatatableProgress.car in com.domain.Car.datatablesProgress
。 I need this because I can have a datatableProgress with the same name and sheet but different car. 我需要这个,因为我可以拥有一个具有相同名称和表单但不同汽车的datatableProgress。 : :
DatatableProgress : DatatableProgress:
@Entity
@Table(name = "datatableprogress")
public class DatatableProgress implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private DatatableProgressKeys datatableProgressKeys;
private Integer actualStoredRow;
@MapsId("car")
@JoinColumns({
@JoinColumn(name="idCar_fk", referencedColumnName="idCar"),
})
@ManyToOne(fetch = FetchType.LAZY)
private Car car;
public DatatableProgress() {
}
public DatatableProgress(DatatableProgressKeys datatableProgressKeys, Integer actualStoredRow) {
this.datatableProgressKeys = datatableProgressKeys;
this.actualStoredRow = actualStoredRow;
}
/**
* @return the datatableKeys
*/
@EmbeddedId
public DatatableProgressKeys getDatatableProgressKeys() {
return datatableProgressKeys;
}
/**
* @param datatableKeys the datatableKeys to set
*/
public void setDatatableProgressKeys(DatatableProgressKeys datatableProgressKeys) {
this.datatableProgressKeys = datatableProgressKeys;
}
@Column(name = "actualStoredRow", nullable = false)
public Integer getActualStoredRow() {
return this.actualStoredRow;
}
public void setActualStoredRow(Integer actualStoredRow) {
this.actualStoredRow = actualStoredRow;
}
}
DatatableProgressKey DatatableProgressKey
@Embeddable
public class DatatableProgressKeys implements Serializable {
private static final long serialVersionUID = 1L;
private String datatableName;
private Integer sheet;
private Car car;
public DatatableProgressKeys() {}
public DatatableProgressKeys(String datatableName, Integer sheet, Car car) {
this.datatableName = datatableName;
this.sheet = sheet;
this.setCar(car);
}
@Column(name = "datatableName", nullable = false)
public String getDatatableName() {
return this.datatableName;
}
public void setDatatableName(String datatableName) {
this.datatableName = datatableName;
}
@Column(name = "sheet", nullable = false)
public Integer getSheet() {
return this.sheet;
}
public void setSheet(Integer sheet) {
this.sheet = sheet;
}
/**
* @return the car
*/
@Column(name = "id_car", nullable = false)
public Car getCar() {
return car;
}
/**
* @param car the car to set
*/
public void setCar(Car car) {
this.car = car;
}
//hashCode and equals
Car 汽车
@Entity
@Table(name = "car")
public class Car implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer idCar;
private Integer initialKm;
@JsonIgnore
private Set<DatatableProgress> datatablesProgress = new HashSet<DatatableProgress>(0);
public Car() {
}
public Car(Integer initialKm) {
this.initialKm = initialKm;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_car", unique = true, nullable = false)
public Integer getIdCar() {
return this.idCar;
}
public void setIdCar(Integer idCar) {
this.idCar = idCar;
}
@Column(name = "initialKm", nullable = false)
public Integer getInitialKm() {
return this.initialKm;
}
public void setInitialKm(Integer initialKm) {
this.initialKm = initialKm;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "car")
public Set<DatatableProgress> getDatatablesProgress() {
return this.datatablesProgress;
}
public void setDatatablesProgress(Set<DatatableProgress> datatablesProgress) {
this.datatablesProgress = datatablesProgress;
}
}
UPDATE: Is it possible to make this change without modify Car entity (so without CarKey class)? 更新:是否可以在不修改Car实体的情况下(而不是CarKey类)进行更改?
To be a part of composite key entity should be @Embedable. 要成为组合键实体的一部分,应@Embedable。 You can create a separate key entity for a Car class just with one Integer field and then use this key class for your composite key. 您可以仅使用一个Integer字段为Car类创建一个单独的键实体,然后将该键类用于您的复合键。 See there Hibernate docs 看到那里的休眠文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.