【发布时间】:2019-11-07 08:59:29
【问题描述】:
我有一个 Production 类和 ProductionDetail 实体类,其中 Production 表的 Id 是作为 ProductionDetail 实体类中的 production_id 的外键,所以我的两个带有映射的实体类都给出如下
生产实体类:
@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 个子记录。任何人都可以向我建议我的代码在哪里出错以及为什么会出现这种情况?请检查我从 API 获得的 JSON 数据。
【问题讨论】:
-
我们可以看看你的 DAO 代码吗,因为实体在我看来没问题。
-
我添加了,请检查DAO代码。