org.hibernate.HibernateException: identifier of an instance
of org.cometd.hibernate.User altered from 12 to 3
実際、私のuser
テーブルはその値を動的に変更する必要があり、Java アプリケーションはマルチスレッドです。それを修正する方法はありますか?
org.hibernate.HibernateException: identifier of an instance
of org.cometd.hibernate.User altered from 12 to 3
実際、私のuser
テーブルはその値を動的に変更する必要があり、Java アプリケーションはマルチスレッドです。それを修正する方法はありますか?
User オブジェクトの主キーの値をどこかで変更していますか? あなたはそれをすべきではありません。主キーのマッピングが正しいことを確認してください。
マッピング XML ファイルまたはマッピング アノテーションはどのように見えますか?
ID フィールドを変更する前に、セッションからエンティティをデタッチする必要があります
私の場合、hbm.xmlのPKフィールドは「integer」タイプでしたが、Beanコードでは。でしたlong
。
私の場合、ゲッターとセッターの名前は変数名とは異なりました。
private Long stockId;
public Long getStockID() {
return stockId;
}
public void setStockID(Long stockID) {
this.stockId = stockID;
}
どこにあるべきか
public Long getStockId() {
return stockId;
}
public void setStockId(Long stockID) {
this.stockId = stockID;
}
私の場合、 @Id フィールド タイプを long から Long に変更して解決しました。
私の特定のケースでは、これは、@Transactional(readOnly = true)
Spring アノテーションを必要とするサービス実装のメソッドが原因でした。それを追加したら、問題は解決しました。珍しいですが、それは単なる選択ステートメントでした。
私の場合、テンプレートにタイプミスがあったため、等価性 (==) をチェックする代わりに、代入等号 (=) を使用していました。
そこで、テンプレート ロジックを次のように変更しました。
if (user1.id = user2.id) ...
に
if (user1.id == user2.id) ...
そして今、すべてが順調です。だから、あなたの意見もチェックしてください!
私もこの問題に直面していました。
ターゲット テーブルはリレーション テーブルであり、異なるテーブルから 2 つの ID を関連付けます。PK を置き換えて、値の組み合わせに UNIQUE 制約があります。タプルの値の 1 つを更新するときに、このエラーが発生しました。
これは、テーブルがどのように見えるかです (MySQL):
CREATE TABLE my_relation_table (
mrt_left_id BIGINT NOT NULL,
mrt_right_id BIGINT NOT NULL,
UNIQUE KEY uix_my_relation_table (mrt_left_id, mrt_right_id),
FOREIGN KEY (mrt_left_id)
REFERENCES left_table(lef_id),
FOREIGN KEY (mrt_right_id)
REFERENCES right_table(rig_id)
);
エンティティの Entity クラスは、RelationWithUnique
基本的に次のようになります。
@Entity
@IdClass(RelationWithUnique.class)
@Table(name = "my_relation_table")
public class RelationWithUnique implements Serializable {
...
@Id
@ManyToOne
@JoinColumn(name = "mrt_left_id", referencedColumnName = "left_table.lef_id")
private LeftTableEntity leftId;
@Id
@ManyToOne
@JoinColumn(name = "mrt_right_id", referencedColumnName = "right_table.rig_id")
private RightTableEntity rightId;
...
私はそれを修正しました
// usually, we need to detach the object as we are updating the PK
// (rightId being part of the UNIQUE constraint) => PK
// but this would produce a duplicate entry,
// therefore, we simply delete the old tuple and add the new one
final RelationWithUnique newRelation = new RelationWithUnique();
newRelation.setLeftId(oldRelation.getLeftId());
newRelation.setRightId(rightId); // here, the value is updated actually
entityManager.remove(oldRelation);
entityManager.persist(newRelation);
PKのヒントをありがとう、私はそれを逃しました。
問題は、さまざまなタイプのオブジェクトの PK (この場合は「ユーザー」) と、hibernate に get を要求するタイプにもある可能性がありますsession.get(type, id);
。
私の場合、エラーはidentifier of an instance of <skipped> was altered from 16 to 32
. オブジェクトの PK タイプはInteger
で、hibernate はタイプを求められましたLong
。
私の場合、データベースにはアクセントのある主キーがありましたが、他のテーブルにはその外部キーがありませんでした。何らかの理由で、MySQL はこれを許可しました。
依存オブジェクトの新しいインスタンスをインスタンス化することでこれを解決します。例として
instanceA.setInstanceB(new InstanceB());
instanceA.setInstanceB(YOUR NEW VALUE);