【问题标题】:updating unidirectional many to one join column value更新单向多对一连接列值
【发布时间】:2017-09-25 07:10:34
【问题描述】:

下面是两个实体类。子类有一个单向的@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 操作。以下代码更新子表。我可以使用设置器更新列。但我无法更新@JoinColumn 字段“植物”,因为我在实体类的@jsoncreator 构造函数中没有它。我该如何更新该字段?

在创建/插入记录时,我设置了 @JoinColumn 字段“植物”,方法是从 plantdetails 实体 id 列而不是通过 @jsoncreator 获取其值。

在 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);
    }

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    您必须以某种方式传递此字段表示的值:

    @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);
        }
    

    【讨论】:

    • 感谢您提供的解决方法。我应该通过新的 LineDetailsInfo 类或使用旧的 LineDetails 类来执行其他 CRUD 操作。
    • 太棒了。很高兴它帮助了你
    • 很抱歉打扰您。请您显示创建(持久)。我无法找到替换 'LineDetails existinglineDetails = (LineDetails) session.get(LineDetails.class, lineDetailsInfo.getLineId());'
    猜你喜欢
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多