web-dev-qa-db-ja.com

Hibernateエラー:このクラスのIDは、save()を呼び出す前に手動で割り当てる必要があります。

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

}
55
程序猿

@Entityクラスの@IdフィールドにはString型があるため、IDを生成できません。

DBで自動インクリメントに変更し、JavaでLongに変更し、@GeneratedValueアノテーションを追加した場合:

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

iDの増分生成を自動的に処理します。

81
Bohemian

休止状態の場合、オブジェクトを永続化/保存する場合、オブジェクトにIDがあることを知っておくことが重要です。したがって、それを確認してください

    private String U_id;

オブジェクトを永続化するまでに値を持ちます。 @GeneratedValueアノテーションを使用するか、値を手動で割り当てることでこれを実行できます。

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

  public Role (String U_id) { ... }

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

さらに注意してください: hibernate documentation で述べられているように、Hibernateはまだデフォルトのコンストラクタを必要とします。既定のコンストラクタを使用してRoleのインスタンス化を防ぐため(およびAPIを設計している場合は他のプログラマも)、それをprivateとして宣言するだけです。

4
matthaeus

Oracleデータベースで定義されたシーケンスIDを使用して、この問題を解決しました。

Oracle_DB_SEQ_IDは、テーブルのシーケンスとして定義されます。また、コンソールを見て、検証に使用されるHibernate SQLを確認します。

@Id
@Column(name = "MY_ID", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "id_Sequence")
@SequenceGenerator(name = "id_Sequence", sequenceName = "Oracle_DB_SEQ_ID")
Long myId;
3
user2601995

これは、2つの方法で解決するために行ったことです。

  1. iD列をint型として作成します

  2. iDでautogenerateを使用している場合、IDのセッターで値を指定しません。一部をマッピングすると、自動生成されたIDが認められない場合があります。 (理由はわかりません)

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

3
jaskirat Singh