2017-09-25 10 views
1

以下に2つのエンティティクラスがあります。子クラスには、一方向の@ManyToOneマッピングがあります。単方向多対1結合列値の更新

PlantDetails:

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

LineDetails:

@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を使用して列を更新できます。しかし、私は@jsoncreatorエンティティクラスのコンストラクタでそれを持っていないので@JoinColumnフィールド "植物"を更新することができません。私はそのフィールドを更新することはできますか?

レコードを作成/挿入するときに、@jsoncreatorではなく、plantdetailsエンティティID列からその値を取得して、@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); 
    } 

答えて

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); 
    } 
+0

感謝を。新しいLineDetailsInfoクラスを使って、あるいは古いLineDetailsクラスを使って、他のCRUD操作を行う必要があります。 – user7620991

+0

素晴らしいあなたを助けてくれてうれしいです。 –

+0

ご迷惑をおかけして申し訳ありません。あなたは作成(永続)のために表示することができますか?私は 'LineDetailsの置き換えを把握することができませんでした' lineDetails =(LineDetails)session.get(LineDetails.class、 lineDetailsInfo.getLineId()); ' – user7620991

関連する問題