2012-06-12 6 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] 

La mia classe è come questo:ID per questa categoria devono essere assegnati manualmente prima di chiamare save():

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

} 

risposta

54

La classe @Entity ha un tipo String per la sua @Id campo, quindi non può generare id per te.

Se si modifica a un incremento automatico della DB e una Long in java, e aggiungere il @GeneratedValue della nota:

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

tratterà incremento generazione id per voi.

+2

Mi mancava: @GeneratedValue (strategia = GenerationType.IDENTITY). Mi ha aiutato. – sns

3

Per l'ibernazione è importante sapere che il proprio oggetto avrà un ID, quando si desidera persistere/salvarlo. Pertanto, assicurati che

private String U_id; 

avrà un valore, per il momento in cui vuoi mantenere l'oggetto. Puoi farlo con l'annotazione @GeneratedValue o assegnando manualmente un valore.

Nel caso avete bisogno o desidera assegnare il tuo id manualmente (e questo è ciò che l'errore di cui sopra è in realtà circa), preferirei passare i valori per i campi al costruttore, almeno per U_id, per esempio

public Role (String U_id) { ... } 

Ciò garantisce che il proprio oggetto abbia un ID, nel momento in cui è stato istanziato. Non so quale sia il tuo caso d'uso e come si comporta la tua concorrenza in concorrenza, tuttavia, in alcuni casi questo non è raccomandato. Devi assicurarti che il tuo ID sia unico.

Ulteriori note: Hibernate richiede ancora un costruttore predefinito, come indicato nello hibernate documentation. Per evitare che tu (e forse altri programmatori se stai progettando un'API) di istanze di utilizzando il costruttore predefinito, dichiaralo come private.

2

Ecco che cosa ho fatto per risolvere solo con 2 modi:

  1. colonna ID marca come int tipo

  2. se si utilizza autogenerate in ID dont assing valore nel setter di ID. Se la mappatura di alcuni ID a volte autogenetati non è concessa. (Non so perché)

  3. provare a utilizzare @GeneratedValue(strategy=GenerationType.SEQUENCE) se possibile

0

risolto questo problema utilizzando un ID sequenza definita nel database Oracle.

ORACLE_DB_SEQ_ID è definito come una sequenza per la tabella. Guarda anche la console per vedere l'Hibernate SQL che viene usato per verificare.

@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; 
Problemi correlati