1

アカウント クラス:

@Entity

@Table(name = "Account")

public class Account {

...

private String accountId;
...

@Id
@GeneratedValue
@Column(name = "accountId")
public String getAccountId() {
    return accountId;
}

public void setAccountId(String accountId) {
    this.accountId = accountId;
}

...

私がそれをしようとすると:

temp = new Account();

temp.setAccountId(tempId); //
session.save(temp);
System.out.println("accountid...." + temp.getAccountId());

tempIdと等しくないaccountIdを出力します。これは、テーブルの自動インクリメントフィールドであるためだと思います

一方、私がそれを行う場合:

temp = new Account();

session.save(temp);
temp.setAccountId(tempId);
session.merge(temp);

私は例外を取得します:

org.hibernate.HibernateException: identifier of an instance 
of ... was altered from 1244 to 1221

どうすればIDを上書きできますか?

4

3 に答える 3

0

ID を設定する必要はありません。エンティティを永続化するときに、hibernate は (生成された値の注釈で定義された戦略に従って) ID を自動的に割り当てます。

わかりませんが、アイデアに文字列値を使用していますが、どのようにインクリメントできますか? 代わりに Long を使用したくありませんか?

于 2013-02-07T11:50:06.833 に答える
0

特定の ID で作業したい場合、データベースにその ID を持つエンティティが既に存在する場合は、最初にセッションからエンティティを取得する必要があります。

Account a = session.get(Account.class, id);

次に、変更を加えてマージします。

于 2013-02-07T13:07:23.390 に答える
0

まず、生成されたフィールドに値を割り当ててはなりません。生成されたものに置き換えられます。これは予想される動作です。

次に、id を変更してはなりません。ID によってデータベースにマップされたすべてのエンティティ。ID を変更すると、新しいエンティティになります。更新することはできません。保存する必要があります。

JPA実装のいずれにもidメカニズムがオーバーライドされているとは思いません。自分で id を設定したい場合は、GeneratedValue アノテーションを削除し、永続ストアに対して同じことを行います。次に、値を ID として保存できます。

于 2013-02-07T12:20:26.573 に答える