У меня есть класс Production и класс сущностей ProductionDetail, где Id of Production table представляет собой ForeignKey как production_id в классе сущностей ProductionDetail, поэтому мой класс сущностей с отображением дал ниже
Класс производственной сущности:
@Entity
@Table(name = "tbl_production")
@XmlRootElement
public class TblProduction implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "ID")
private String id;
@Column(name = "PRODUCTION_DATE")
@Temporal(TemporalType.DATE)
private Date productionDate;
@Column(name = "START_DATETIME")
@Temporal(TemporalType.TIMESTAMP)
private Date startDatetime;
@Column(name = "END_DATETIME")
@Temporal(TemporalType.TIMESTAMP)
private Date endDatetime;
@Size(max = 45)
@Column(name = "MACHINE_UUID")
private String machineUuid;
**Relation with Production Details Table**
@OneToMany(mappedBy = "production")
@XmlElement(name = "productionDetails")
private List<TblProductionDetail> productionDetailList;
@PrimaryKeyJoinColumn(name = "MACHINE_UUID", referencedColumnName = "UUID")
@ManyToOne(fetch = FetchType.LAZY)
private MstMachine mstMachine;
@XmlTransient
public MstMachine getMstMachine() {
return this.mstMachine;
}
}
Сведения о производстве Класс сущности:
@Entity
@Table(name = "tbl_production_detail")
@XmlRootElement
public class TblProductionDetail implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "ID")
private String id;
@Size(max = 45)
@Column(name = "COMPONENT_ID")
private String componentId;
@Size(max = 45)
@Column(name = "PRODUCTION_ID")
private String productionId;
**Relation with Production Class**
@ManyToOne
@JoinColumn(name = "PRODUCTION_ID", referencedColumnName = "ID", insertable = false,
updatable = false)
private TblProduction production;
@Transient
public String componentCode;
@Transient
public String componentName;
@PrimaryKeyJoinColumn(name = "COMPONENT_ID", referencedColumnName = "ID")
@ManyToOne(fetch = FetchType.LAZY)
private MstComponent mstComponent;
@XmlTransient
public MstComponent getMstComponent() {
return this.mstComponent;
}
public void setMstComponent(MstComponent mstComponent) {
this.mstComponent = mstComponent;
}
}
Класс родительского списка:
public class TblProductionList {
private List<TblProduction> productionList;
public TblProductionList() {
productionList = new ArrayList<>();
}
public List<TblProduction> getTblProductions() {
return productionList;
}
public void setTblProductions(List<TblProduction> tblProductionList) {
this.productionList = tblProductionList;
}
}
BusinessLogic (класс DAO):
public TblProductionList getJson() {
TblProductionList response = new TblProductionList();
StringBuilder retrieveQuery = new StringBuilder();
retrieveQuery.append(" SELECT prod FROM TblProduction prod ");
retrieveQuery.append(" JOIN FETCH prod.productionDetailList ");
retrieveQuery.append(" WHERE prod.endDatetime IS NULL ");
retrieveQuery.append(" AND prod.machineUuid IS NOT NULL ");
retrieveQuery.append(" AND NOT EXISTS (SELECT tpt FROM
TblProductionThset tpt WHERE prod.id = tpt.productionId) ");
retrieveQuery.append(" AND EXISTS (SELECT mmfd FROM
MstMachineFileDef mmfd WHERE prod.machineUuid = mmfd.machineUuid
AND mmfd.hasThreshold = 1) ");
retrieveQuery.append(" ORDER BY prod.id ");
Query query =
entityManager.createQuery(retrieveQuery.toString());
List thresholdList = query.getResultList();
response.setTblProductions(thresholdList);
return response;
}
По базе данныхЯ получаю ожидаемые основные дочерние данные, как показано ниже:
После разработки этого класса сущностей я ожидаю, что получу 3 основных записи, в каждой записи которых есть 2 подробные записи. Но я получаю 6 дубликатов основных записей с 12 дочерними записями. Кто-нибудь может подсказать, пожалуйста, где мой код стал неправильным и почему возникла эта ситуация? пожалуйста, проверьте данные JSON, которые я получаю от API.