原因: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;
}
}
@Entity
クラスの@Id
フィールドにはString
型があるため、IDを生成できません。
DBで自動インクリメントに変更し、JavaでLong
に変更し、@GeneratedValue
アノテーションを追加した場合:
@Id
@Column(name="U_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long U_id;
iDの増分生成を自動的に処理します。
休止状態の場合、オブジェクトを永続化/保存する場合、オブジェクトにIDがあることを知っておくことが重要です。したがって、それを確認してください
private String U_id;
オブジェクトを永続化するまでに値を持ちます。 @GeneratedValue
アノテーションを使用するか、値を手動で割り当てることでこれを実行できます。
IDを手動で割り当てる必要がある場合(または、上記のエラーが実際にそうなっている場合)、少なくともU_id
などのフィールドの値をコンストラクターに渡すことをお勧めします。
public Role (String U_id) { ... }
これにより、オブジェクトをインスタンス化するまでに、オブジェクトにidが設定されます。あなたのユースケースが何であり、アプリケーションが並行してどのように動作するかはわかりませんが、場合によっては推奨されません。 IDが一意であることを確認する必要があります。
さらに注意してください: hibernate documentation で述べられているように、Hibernateはまだデフォルトのコンストラクタを必要とします。既定のコンストラクタを使用してRole
のインスタンス化を防ぐため(およびAPIを設計している場合は他のプログラマも)、それをprivate
として宣言するだけです。
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;
これは、2つの方法で解決するために行ったことです。
iD列をint
型として作成します
iDでautogenerateを使用している場合、IDのセッターで値を指定しません。一部をマッピングすると、自動生成されたIDが認められない場合があります。 (理由はわかりません)
可能であれば@GeneratedValue(strategy=GenerationType.SEQUENCE)
を使用してみてください