2012-06-12 7 views
37
 
Caused by: org.springframework.orm.hibernate3.HibernateSystemException: ids for this class must be manually assigned before calling save(): com.rfid.model.Role; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.rfid.model.Role 
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676) 
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 
    at 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 
    Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling 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] 

私のクラスでは、このようなものです:IDS手動(保存呼び出す前に割り当てる必要があります):

@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; 
} 

} 

答えて

54

あなた@Entityクラスは、その@IdフィールドのStringタイプを持っているので、それができませんidsを生成します。

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

それはあなたのためのIDの生成をインクリメント処理します:あなたがDBで自動インクリメントおよびJavaでLongにそれを変更し、@GeneratedValue注釈を追加した場合

+2

@GeneratedValue(strategy = GenerationType.IDENTITY)が見つかりませんでした。それは私を助けた。 – sns

3

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

private String U_id; 

@GeneratedValueアノテーションを使用するか、値を手動で割り当てることでこれを行うことができます。

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

public Role (String U_id) { ... } 

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

その他の注意:Hibernateは、hibernate documentationに記載されているように、依然としてデフォルトのコンストラクタを必要とします。既定のコンストラクタを使用してRoleのインスタンス化のあなた(そして、おそらく他のプログラマ)を防ぐために、それをprivateとして宣言してください。ここで

2

は、私は2つの方法でちょうど解決するために何をしたかである:

  1. あなたがIDで自動生成を使用している場合のセッターで値をASSINGいけないintタイプ

  2. としてID列を作りますID。あなたのマッピングがいくつかの場合、時折自動生成されたIDは受け入れられません。

  3. 試みは、Oracleデータベースで定義されたシーケンスIDを使用してこの問題を解決可能

0

場合@GeneratedValue(strategy=GenerationType.SEQUENCE)を使用して(私はなぜ知りません)。

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; 
関連する問題