87
原因: org.springframework.orm.hibernate3.HibernateSystemException: このクラスの ID は、save() を呼び出す前に手動で割り当てる必要があります: com.rfid.model.Role; ネストされた例外は org.hibernate.id.IdentifierGenerationException です: このクラスの ID は、save() を呼び出す前に手動で割り当てる必要があります: com.rfid.model.Role
    org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676) で
    org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException (HibernateAccessor.java:412) で
    org.springframework.orm.hibernate3.HibernateTemplate.doExecute (HibernateTemplate.java:424) で
    org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) で
    org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:748) で
    com.wfos.engine.wrapper.domain.impl.WrapperImpl.save (WrapperImpl.java:159) で
    ... 47 以上
    原因: org.hibernate.id.IdentifierGenerationException: save() を呼び出す前に、このクラスの ID を手動で割り当てる必要があります: com.rfid.model.Role
    org.hibernate.id.Assigned.generate (Assigned.java:53) で
    org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId (AbstractSaveEventListener.java:121) で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient (DefaultSaveOrUpdateEventListener.java:195) で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) で
    org.hibernate.impl.SessionImpl.fireSaveOrUpdate (SessionImpl.java:685) で
    org.hibernate.impl.SessionImpl.saveOrUpdate (SessionImpl.java:677) で
    org.hibernate.impl.SessionImpl.saveOrUpdate (SessionImpl.java:673) で
    org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:751) で
    org.springframework.orm.hibernate3.HibernateTemplate.doExecute (HibernateTemplate.java:419) で
    ... 50以上
    WARN [21:14:21] (CommonsLoggingOutput.java:59): - --エラー: batchId[1] メッセージ[java.lang.reflect.UndeclaredThrowableException]

私のクラスは次のようなものです:

@Entity
@javax.persistence.Table(name="Role")
@Table(appliesTo = "Role")
public class Role {

@Id  
@Column(name="U_id")
public String U_id;

public String U_pwd;

public String U_account;

public String U_mode;

public String U_status;


public String getU_pwd() {
    return U_pwd;
}

public void setU_pwd(String u_pwd) {
    U_pwd = u_pwd;
}

public String getU_account() {
    return U_account;
}

public void setU_account(String u_account) {
    U_account = u_account;
}

public String getU_id() {
    return U_id;
}

public void setU_id(String u_id) {
    U_id = u_id;
}

public String getU_mode() {
    return U_mode;
}

public void setU_mode(String u_mode) {
    U_mode = u_mode;
}

public String getU_status() {
    return U_status;
}

public void setU_status(String u_status) {
    U_status = u_status;
}

}
4

9 に答える 9

136

@EntityクラスにはStringそのフィールドのタイプがあるため、 @IdIDを生成することはできません。

DBでは自動インクリメントに、Javaではaに変更し、アノテーションLongを追加すると、次のようになります。@GeneratedValue

@Id
@Column(name="U_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long U_id;

ID生成の増分を処理します。

于 2012-06-12T13:36:54.673 に答える
4

Hibernateの場合、オブジェクトを永続化/保存するときに、オブジェクトにIDがあることを知っておくことが重要です。したがって、

    private String U_id;

オブジェクトを永続化するときまでに、値があります。@GeneratedValueこれは、注釈を使用するか、手動で値を割り当てることで実行できます。

IDを手動で割り当てる必要がある、または割り当てたい場合(そして、それが実際には上記のエラーの原因です)、少なくともU_idたとえば、フィールドの値をコンストラクターに渡すことをお勧めします。

  public Role (String U_id) { ... }

これにより、インスタンス化するまでに、オブジェクトにIDが確実に割り当てられます。あなたのユースケースが何であるか、そしてあなたのアプリケーションが並行してどのように振る舞うかはわかりませんが、場合によってはこれが推奨されません。IDが一意であることを確認する必要があります。

さらに注意:Hibernateのドキュメントに記載されているように、Hibernateには引き続きデフォルトのコンストラクターが必要です。デフォルトのコンストラクターを使用してインスタンス化されるのを防ぐために(APIを設計している場合は他のプログラマーも)、Roleそれをとして宣言するだけprivateです。

于 2013-02-21T09:44:19.040 に答える
3

2つの方法だけで解決するために私がしたことは次のとおりです。

  1. ID列をintタイプにする

  2. ID でautogenerateを使用している場合は、ID のセッターで値を設定しないでください。いくつかのマッピングを行うと、自動生成された ID が考慮されないことがあります。(どうしてか分かりません)

  3. @GeneratedValue(strategy=GenerationType.SEQUENCE)可能であれば使ってみてください

于 2013-02-28T08:46:30.323 に答える
0

数値 ID 値のタイプが一致しない場合、H2 データベースでこのエラーが発生しました。多数の SQL ステートメントを介してテーブルを生成および設定し、id を INT に設定します。後でEntity Javaクラスを作成し、IDをLongに設定しました。Java クラスの ID のタイプを調整した後、問題が解決されました。

于 2021-06-08T04:14:21.147 に答える