2017-10-26 9 views
0

私はいくつかのデータを保存するロジックを持っており、私はスプリングブート+スプリングデータjpaを使用します。Spring JPAは、コンポジットプライマリキーが期待通りに機能しない別個のエンティティを保存し、同じエンティティを更新します。

今、私は1つのオブジェクトを保存しなければならず、瞬時に別のオブジェクトを保存する必要があります。 オブジェクトの主キーのプロパティは3つあります。 - partCode、setCode、itemCode

SetItem関数(partCode = 10から001、SETCODE = 04、itemCode = 01から0021、数量= 1.0、sortNo = 2、項目= NULL:

は以下戻っ)さんが、第1の目的は(のtoStringを持っているとしましょう)

及び第二の目的は、以下の戻りのtoStringを有する:

SetItem関数(partCode = 10から001、SETCODE = 04、itemCode = 01から0031、数量= 1.0、sortNo = 2、アイテム= NULL )

itemCodeの値に違いがあり、itemCodeプロパティが主キーに属しているため、2つのオブジェクトが互いに異なります。

私の場合、プログラムを実行すると、webappは最初のオブジェクトを保存し、最初のオブジェクトを2番目のオブジェクト値で更新し、オブジェクトを別に保存しません。

enter image description here

(画像の上に、この記事の質問とは別の値が含まれています)

ここでは私のエンティティの情報は次のとおりです。

/** 
* The persistent class for the set_item database table. 
* 
*/ 
@Data 
@DynamicInsert 
@DynamicUpdate 
@Entity 
@ToString(includeFieldNames=true) 
@Table(name="set_item") 
@IdClass(SetGroupId.class) 
public class SetItem extends BasicJpaModel<SetItemId> { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="PART_CODE") 
    private String partCode; 

    @Id 
    @Column(name="SET_CODE") 
    private String setCode; 

    @Id 
    @Column(name="ITEM_CODE") 
    private String itemCode; 

    private Double qty; 

    @Column(name="SORT_NO") 
    private int sortNo; 

    @Override 
    public SetItemId getId() { 

     if(BooleanUtils.ifNull(partCode, setCode, itemCode)){ 
      return null; 
     } 
     return SetItemId.of(partCode, setCode, itemCode); 
    } 

    @ManyToMany(fetch=FetchType.LAZY) 
    @JoinColumns(value = { 
      @JoinColumn(name="PART_CODE", referencedColumnName="PART_CODE", insertable=false, updatable=false) 
      , @JoinColumn(name="ITEM_CODE", referencedColumnName="ITEM_CODE", insertable=false, updatable=false) 
    }) 
    private List<Item> item; 

} 

そこで問題は、私が個別にオブジェクトを保存しますか、 ですオブジェクトの複合主キーは部分的に同じです。

EDIT: エンティティクラスの下に延びている。

@Setter 
@Getter 
@MappedSuperclass 
@DynamicInsert 
@DynamicUpdate 
public abstract class BasicJpaModel<PK extends Serializable> implements Persistable<PK>, Serializable { 

    @Override 
    @JsonIgnore 
    public boolean isNew() { 
     return null == getId(); 
    } 
} 

EDIT再び:埋め込みクラス。 Soneoneが埋め込み可能なクラスを指摘した後、私はただ2つのプロパティしかないことに気付きました。それは3つでなければなりません。ありがとうございました。

@Data 
@NoArgsConstructor 
@RequiredArgsConstructor(staticName="of") 
@Embeddable 
public class SetGroupId implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @NonNull 
    private String partCode; 

    @NonNull 
    private String setCode; 

} 

答えて

0

チェックハウツー使用@EmbeddedId & @Embeddable@Embeddable作品でColumn sの場合はわからない、あなたはidフィールドにAttributeOverridesを使用する必要があります更新)。

注釈付きクラス@Embeddableを作成し、そこに3つのIDフィールドをすべて追加することができます。

@Embeddable 
public class MyId { 
    private String partCode; 
    private String setCode; 
    private String itemCode;  
} 

必要なゲッターを追加します。&セッター。

次に、クラスSetItemにこのクラスを `@ EmbeddedId 'のようなIDに設定します。

public class SetItem { 

    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride(name="partCode", 
         [email protected](name="PART_CODE")), 
     @AttributeOverride(name="setCode", 
         [email protected](name="SET_CODE")) 
     @AttributeOverride(name="itemCode", 
         [email protected](name="ITEM_CODE")) 
    }) 
    MyId id; 

チェックもWhich annotation should I use: @IdClass or @EmbeddedId

+0

ありがとうございます。私は埋め込み可能なクラスを見た。 3つではなく2つのプロパティだけが存在します。私はこれを変えて何が起こるかを見ます。本当にありがとう。 – PLAYMAKER

0

SetGroupId内のequalsとhashCodeを実装するようにしてください。

あなたはそのクラスを提供できますか?

+0

良いアイデア、ありがとう。私はその方法も実装します – PLAYMAKER

関連する問題