2016-05-28 11 views
0

春データjpaの親レコードを更新しているときに例外が発生しています。HibernateException-ドメインのインスタンスの識別子がXからYに変更されました

これは私のコードです:

ParentEntity

@Entity 
@Table(name = "CAMP") 
@Getter 
@Setter 
public class Parent extends AbstractEntity { 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tkeygenerator") 
@GenericGenerator(name = "tkeygenerator", strategy = "com.custom.TKeyGenerator", 
parameters = {@org.hibernate.annotations.Parameter(name = "sequence", value = "TKEY_SEQ")}) 
@Column(name = "TKEY", nullable = false)  
private String id; 
@ManyToOne 
@JoinColumn(name = "SUB_CAT_TYPE_CODE", referencedColumnName = "SUB_CAT_TYPE_CODE") 
private Child child; 
@Column(name = "DATE") 
@Basic 
private LocalDate date; 
} 

子エンティティ

@Entity 
@Table(name = "SUB_CAT_TYPE") 
@AttributeOverrides({ 
@AttributeOverride(name = "code", 
        column = @Column(name = "SUB_CAT_TYPE_CODE", length = 30)), 
@AttributeOverride(name = "description", 
        column = @Column(name = "SUB_CAT_TYPE_DESC", length = 255))}) 
@EqualsAndHashCode(callSuper = true) 
public class Child extends AbstractTypeDesc {} 

TestCode

public Parent update(@PathVariable("id") String id, @Valid @RequestBody UpdateDto dto) { 

     Parent parentObj = parentRepository.findById(id); 
     mapper.map(dto, parentObj); // Dozer to map incoming dto to domain     

     childRepository.findByCode(dto.child().getCode()) 
        .map(child -> { 
          parentObj.setChild(child); 
          return child; 
         }); 

     return parentRepository.save(parentObj); //Exception occurs here 
}  

親エンティティの子エンティティのコード変数をfkとして更新しようとしているときに例外が発生します。それはcan't alter code from X to Yと言います。

提案がありますか?

答えて

0

上記の更新操作のコードブロックで何がうまくいかなかったのかわかりました.Dtoをドメインにマップする原因となっていた原因は、子エンティティの値を変更していました。 setterメソッドを使って子エンティティを設定しようとしていたのですが、 "Idは例外を変更しました"ということが起こっていました。以下は作業中の作業コードです。

テストコードは

public Parent update(@PathVariable("id") String id, @Valid @RequestBody  UpdateDto dto) { 

Parent parentObj = parentRepository.findById(id); 

childRepository.findByCode(dto.child().getCode()) 
       .map(child -> { 
         parentObj.setChild(child); 
         return child; 
        }); 
mapper.map(dto, parentObj); // Dozer dto to domain mapping was causing problem     

return parentRepository.save(parentObj); 
} 
ようにする必要があります
関連する問題