[英]updating unidirectional many to one join column value
下面是两个实体类。 子类有一个单向的@ManyToOne
映射。
工厂详情:
@Entity
@Table(name = "PLANT_DETAILS", uniqueConstraints={ @UniqueConstraint(columnNames = {"PLANT"})})
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler", "ignoreUnknown = true"})
public class PlantDetails implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "PLANT_ID")
private Long plantId;
@Column(name = "PLANT")
private String plant;
@Column(name = "PLANT_DETAILS")
private String plant_Details;
@Column(name = "LOCATION")
private String location;
@JsonCreator
public PlantDetails( @JsonProperty("plantId") Long plantId,
@JsonProperty("plant") String plant,
@JsonProperty("plant_Details") String plant_Details,
@JsonProperty("location") String location )
{
this.plantId = plantId;
this.plant = plant;
this.plant_Details = plant_Details;
this.location = location;
}
线路详情:
@Entity
@Table(name = "LINE_DETAILS", uniqueConstraints={ @UniqueConstraint(columnNames = { "PLANT", "LINE_NAME" })})
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler", "ignoreUnknown = true"})
public class LineDetails implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "LINE_ID")
private Long lineId;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="PLANT", referencedColumnName = "PLANT")
private PlantDetails plantDetails;
@Column(name = "LINE_NAME")
private String lineName;
@Column(name = "LINE_DESCRIPTION")
private String lineDescription;
@JsonCreator
public LineDetails( @JsonProperty("lineId") Long lineId,
@JsonProperty("lineName") String lineName,
@JsonProperty("lineDescription") String lineDescription) {
this.lineId = lineId;
this.lineName = lineName;
this.lineDescription = lineDescription;
}
我正在尝试进行基本的 CRUD 操作。 以下代码更新子表。我可以使用 setter 更新列。 但是我无法更新@JoinColumn
字段“植物”,因为我在实体类的@jsoncreator
构造函数中没有它。我该如何更新该字段?
在创建/插入记录时,我通过从 plantdetails 实体 id 列而不是通过@jsoncreator
获取其值来设置@JoinColumn
字段“植物”。
在 DAOimpl 中
@Override
public void updateLineDetails(LineDetails lineDetails) {
Session session = this.sessionFactory.getCurrentSession();
LineDetails existinglineDetails = (LineDetails) session.get(LineDetails.class,
lineDetails.getLineId());
existinglineDetails.setLineName(lineDetails.getLineName());
existinglineDetails.setLineDescription(lineDetails.getLineDescription());
session.update(existinglineDetails);
}
您必须以某种方式传递此字段表示的值:
@Column(name = "PLANT")
private String plant;
我一般不会通过实体结构本身传递数据。 我将创建额外的LineDetailsInfo
类,将所有信息保存在普通字段中。
public class LineDetailsInfo{
@JsonCreator
public LineDetails( @JsonProperty("lineId") Long lineId,
@JsonProperty("lineName") String lineName,
@JsonProperty("lineDescription") String lineDescription,
@JsonProperty("plant") String plant) {
this.plant = plant;
this.lineId = lineId;
this.lineName = lineName;
this.lineDescription = lineDescription;
}
}
然后您需要查询该特定PlantDetails
实体并相应地更新父实体:
@Override
public void updateLineDetails(LineDetailsInfo lineDetailsInfo) {
Session session = this.sessionFactory.getCurrentSession();
PlantDetails pd = (PlantDetails)session.createQuery("from PlantDetails where plant = :plant")
.setString("plant", lineDetailsInfo.getPlant()).uniqueResult();
LineDetails existinglineDetails = (LineDetails) session.get(LineDetails.class,
lineDetailsInfo.getLineId());
existinglineDetails.setLineName(lineDetailsInfo.getLineName());
existinglineDetails.setPlantDetails(pd);
existinglineDetails.setLineDescription(lineDetailsInfo.getLineDescription())
session.update(existinglineDetails);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.