90 votes

Erreur Hibernate : les identifiants de cette classe doivent être attribués manuellement avant d'appeler save() :

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\]

Ma classe est comme ça :

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

}

139voto

Bohemian Points 134107

Votre @Entity a un String pour son @Id donc il ne peut pas générer d'identifiants pour vous.

Si vous le changez en un incrément automatique dans la base de données et une Long en java, et ajoutez le @GeneratedValue annotation :

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

il s'occupera de la génération d'identifiants incrémentaux pour vous.

9voto

user2601995 Points 641

J'ai résolu ce problème en utilisant un ID de séquence défini dans la base de données Oracle.

ORACLE_DB_SEQ_ID est défini comme une séquence pour le tableau. Regardez également la console pour voir le SQL Hibernate qui est utilisé pour la vérification.

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

4voto

matthaeus Points 152

Pour Hibernate, il est important de savoir que votre objet aura un identifiant lorsque vous voudrez le sauvegarder. Ainsi, assurez-vous que

    private String U_id;

aura une valeur, au moment où vous allez persister votre objet. Vous pouvez le faire avec la fonction @GeneratedValue ou en attribuant une valeur manuellement.

Dans le cas où vous devez ou voulez assigner vos ids manuellement (et c'est ce que l'erreur ci-dessus concerne en fait), je préférerais passer les valeurs pour les champs à votre constructeur, au moins pour U_id par exemple

  public Role (String U_id) { ... }

Cela garantit que votre objet a un identifiant, au moment où vous l'avez instancié. Je ne sais pas quel est votre cas d'utilisation et comment votre application se comporte dans la concurrence, cependant, dans certains cas, ce n'est pas recommandé. Vous devez vous assurer que votre identifiant est unique.

Remarque supplémentaire : Hibernate exigera toujours un constructeur par défaut, comme indiqué dans la section documentation hibernate . Afin de vous éviter (et peut-être aux autres programmeurs si vous concevez une api) des instanciations de Role en utilisant le constructeur par défaut, il suffit de le déclarer en tant que private .

3voto

jaskirat Singh Points 65

Voici ce que j'ai fait pour résoudre le problème par 2 moyens :

  1. faire la colonne ID comme int type

  2. si vous utilisez autogénérer dans ID dont assing value in the setter of ID. Si vous mettez en correspondance les uns et les autres, alors parfois l'ID autogénéré n'est pas concédé. (je ne sais pas pourquoi)

  3. essayez d'utiliser @GeneratedValue(strategy=GenerationType.SEQUENCE) si possible

0voto

metatron Points 351

J'ai obtenu cette erreur avec la base de données H2 lorsque le type de la valeur d'identification numérique ne correspond pas. J'ai généré et rempli la table via un certain nombre d'instructions sql et j'ai défini l'identifiant comme étant INT. Plus tard, j'ai créé une classe Java Entity et j'ai défini l'id comme étant Long. Le problème a été résolu après avoir ajusté le type d'identifiant dans la classe Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X