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

Mi clase es la siguiente:ID para esta categoría deberán ser asignados manualmente antes de llamar a 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; 
} 

} 

Respuesta

54

Su clase @Entity tiene un tipo String por su campo @Id, por lo que no puede generar identificadores para ti.

Si lo cambia a un incremento automático en el PP y una Long en Java, y añadir la @GeneratedValue anotación:

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

que se encargará de incrementar la generación de Identificación para usted.

+2

Me falta: @GeneratedValue (strategy = GenerationType.IDENTITY). Me ayudó. – sns

3

Para hibernar, es importante saber que su objeto TENDRÁ una identificación, cuando quiera conservarlo/guardarlo. Por lo tanto, asegúrese de que

private String U_id; 

tendrá un valor cuando el objeto persista. Puede hacerlo con la anotación @GeneratedValue o asignando un valor manualmente.

En el caso de que necesite o desee asignar sus identificadores manualmente (y de eso trata el error anterior), preferiría pasar los valores de los campos a su constructor, al menos para U_id, p.

public Role (String U_id) { ... } 

Esto asegura que su objeto tiene una identificación, en el momento que lo ha instanciado. No sé cuál es su caso de uso y cómo se comporta su aplicación en concurrencia, sin embargo, en algunos casos esto no es recomendable. Debe asegurarse de que su identificación sea única.

Nota adicional: Hibernate aún requerirá un constructor predeterminado, como se indica en el hibernate documentation. Para evitar que usted (y tal vez otros programadores si está diseñando una API) de instancias de Role utilizando el constructor predeterminado, simplemente declare como private.

2

Aquí es lo que hice para resolver con sólo 2 maneras:

  1. columna ID marca como int tipo

  2. si utiliza autogenerate ID no te assing valor en la incubadora de CARNÉ DE IDENTIDAD. Si su asignación es cierta, algunas veces la identificación autogenerada no se concede. (No sé por qué)

  3. tratar de usar @GeneratedValue(strategy=GenerationType.SEQUENCE) si es posible

0

Se resuelve este problema usando un identificador de secuencia definida en la base de datos Oracle.

ORACLE_DB_SEQ_ID se define como una secuencia para la tabla. También mire la consola para ver el Hibernate SQL que se usa para verificar.

@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; 
Cuestiones relacionadas