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.Date
SQLの持つPRIMARY KEY列にDATE
データ型を、あなたは(JPAポイント・オブ・ビューから)一意の値を参照してください一意制約をいつでも違反データベースに永続化される時のみ時間の第二の割合は異なっています。
あなたが観察しているように見えるとして、DBへの列のデータ型を変更すると、TIMESTAMP
問題を解決し、あなたのキースペース-列の時間分解能が増加します。