hibernate - ejemplos - id de cliente google
Los ID de esta clase se deben asignar manualmente antes de llamar a save(): (4)
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 así:
@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;
}
}
Esto es lo que hice para resolver solo de 2 maneras:
hacer la columna de ID como tipo
int
si está utilizando autogenerar en ID, no asigne valor en el setter de ID. Si su asignación es cierta, algunas veces la identificación autogenerada no se concede. (No sé por qué)
intente usar
@GeneratedValue(strategy=GenerationType.SEQUENCE)
si es posible
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, en el momento en que va a persistir su objeto. 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 se trata en realidad el error anterior), preferiría pasar los valores de los campos a su constructor, al menos para U_id
, por ejemplo
public Role (String U_id) { ... }
Esto garantiza que su objeto tenga una identificación, en el momento en que la haya 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 la documentación de hibernación . 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
.
Se resolvió este problema utilizando una ID 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;
Su clase @Entity
tiene un tipo de String
para su campo @Id
, por lo que no puede generar identificadores para usted.
Si lo cambia a un incremento automático en el DB y un Long
en java, y agrega la anotación @GeneratedValue
:
@Id
@Column(name="U_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long U_id;
se encargará de incrementar la generación de id.