PK違反が発生し、リストの保存JPAのための目の第二セット

Micho Rizo:

私はFooarIdの私FoobarId class.All 3つの分野である私のfoobarのテーブルの複合PKである列を持つOracle DBのテーブルを持っています。

私は、最初の実行で大丈夫データを挿入しています。私は再びそれを実行したときしかし、私はORA-00001を取得しています:私のPKに違反していることを一意制約を。私は罰金を実行し、他のプロジェクトで同様のコードを持っています。この1はレコードを更新する代わりに、再び挿入をやろうとしていないようです。私embeddedIdに何か問題はありますか?

私のエンティティクラス:

@Entity
@Table(name = "FOOBAR_TABLE")
public class Foobar implements Serializable {

    private static final long serialVersionUID = 4290109857781985996L;

    private FoobarId foobarId;

    private int containerId;
    private String containerType;
    private String action;

    public Foobar() { }

    public Foobar(String itemName, int itemId, Date itemDate) {
        foobarId = new FoobarId(itemName, itemId, itemDate);
    }

    @EmbeddedId
    public FoobarId getFoobarId() {
        return foobarId;
    }

    public void setFoobarId(FoobarId foobarId) {
        this.foobarId = foobarId;
    }

    // getters and settters

}

私のIDクラス:

@Embeddable
public class FoobarId  implements Serializable{

    private static final long serialVersionUID = 7393136028821250311L;

    private int itemId;
    private String itemName;
    private Date itemDate;

    public FoobarId(){}

    public FoobarId(String itemName, int itemId, Date itemDate) {
        super();
        this.itemId = itemId;
        this.itemName = itemName;
        this.itemDate = itemDate;
    }

    // getters/setters

    @Override
 public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((itemDate == null) ? 0 : itemDate.hashCode());
    result = prime * result + ((itemName == null) ? 0 : itemName.hashCode());
    result = prime * result + itemId;
    return result;
}


@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    FoobarId other = (FoobarId) obj;
    if (itemDate == null) {
        if (other.itemDate != null) {
            return false;
        }
    } else if (!itemDate.equals(other.itemDate)) {
        return false;
    }
    if (itemName == null) {
        if (other.itemName != null) {
            return false;
        }
    } else if (!itemName.equals(other.itemName)) {
        return false;
    }
    if (itemId != other.itemId) {
        return false;
    }
    return true;
}
}

私はCrudRepositoryを拡張し、必要なリポジトリのインターフェースを持っています。

私のサービスクラスでは、私はfoobarの項目のリストを保存しています:

@Transactional
public void addList(List<Activity> itemList) {
    logger.info("Saving Activity List size of: " + itemList.size());
    activityRepository.save(itemList);
}

テーブルのSQLを作成します。

  CREATE TABLE "FOOBAR" 
   (    
    "ITEM_NAME" VARCHAR2(50 CHAR) NOT NULL ENABLE, 
    "ITEM_ID" NUMBER NOT NULL ENABLE, 
    "ITEM_DATE" DATE NOT NULL ENABLE, 
    "CONTAINER_ID" NUMBER, 
    "CONTAINER_TYPE" VARCHAR2(50 CHAR), 
    "ACTION" VARCHAR2(50 CHAR), 
     CONSTRAINT "FOOBAR_PK" PRIMARY KEY ("ITEM_NAME", "ITEM_ID", "ITEM_DATE")
     )
ミック・ニーモニック:

意味は文脈に依存しているため、「日付」はトリッキーです。例えば、java.util.Dateミリ秒の精度で時間を含みますが、OracleのSQLのDATEデータ型は、1秒の精度までの時間と一緒に日付を意味します。Javaコードは、の平等のセマンティクスを使用している場合はjava.util.DateSQLの持つPRIMARY KEY列にDATEデータ型を、あなたは(JPAポイント・オブ・ビューから)一意の値を参照してください一意制約をいつでも違反データベースに永続化される時のみ時間の第二の割合は異なっています。

あなたが観察しているように見えるとして、DBへの列のデータ型を変更すると、TIMESTAMP問題を解決し、あなたのキースペース-列の時間分解能が増加します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=281804&siteId=1