web-dev-qa-db-fra.com

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

 Causée par: org.springframework.orm.hibernate3.HibernateSystemException: les identifiants de cette classe doivent être attribués manuellement avant l'appel de save (): com.rfid.model.Role; L'exception imbriquée est org.hibernate.id.IdentifierGenerationException: les ID de cette classe doivent être attribués manuellement avant d'appeler save (): com.rfid.model.Role 
 à org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException ( SessionFactoryUtils.Java:676)
 At org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException (HibernateAccessor.Java:412) 
 À org.springframework.orm.HibernateTangel.do Java: 424) 
 Dans org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession (HibernateTemplate.Java:374) 
 Dans org.springframework.orm.hibernate3.HibernateTemplate.HibernateTemplate.HibernateTemplate.save. 748) 
 Sur com.wfos.engine.wrapper.domain.impl.WrapperImpl.save (WrapperImpl.Java:159) 
 ... 47 autres 
 Causée par: org. hibernate.id.IdentifierGenerationException: les identifiants de cette classe doivent être attribués manuellement avant d'appeler save (): com .rfid.model.Role 
 à org.hibernate.id.Assigned.generate (Assigned.Java:53) 
 à org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId (AbstractSaveEventListener.Java: 121) 
 At org.hibernate.event.def.DefaultSaveOUpDateEupener.save avecGénéréOrdestedId (DefaultSaveOUpdateEventOrdinateur). 
 at org.hibernate.event.def.DefaultSaveOveDateDateEvent.performat.OuvertureDeDate (DefaultSaveOrUpdateEvent.Java:117) ____.] à org.hibernate.impl.SessionImpl.fireSaveOrUpdate (SessionImpl.Java:685) 
 à org.hibernate.impl.SessionImpl.saveOrUpdate (SessionImpl.Java:677) à org. hibernate.impl.SessionImpl.saveOrUpdate (SessionImpl.Java:673) 
 à org.springframework.orm.hibernate3.HibernateTemplate $ 16.doInHibernate (HibernateTemplate.Java:751) 
 à l'adresse org.springframework.orm.hibernate3.HibernateTemplate.o.Execute (HibernateTemplate.Java:419). ... 50 plus 
 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;
}

}
55
程序猿

Votre @Entity La classe a un type String pour son @Id _ champ, il ne peut donc pas générer d'identifiant pour vous.

Si vous le changez en incrémentation automatique dans la base de données et en Long en Java, ajoutez le @GeneratedValue annotation:

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

il gérera la génération incrémentante d'identifiants pour vous.

81
Bohemian

Pour l'hibernation, il est important de savoir que votre objet aura un identifiant lorsque vous souhaitez le conserver/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 le @GeneratedValue annotation ou en affectant une valeur manuellement.

Dans le cas où vous avez besoin ou souhaitez attribuer manuellement votre identifiant (et c'est en cela que l'erreur ci-dessus concerne en réalité), je préférerais transmettre les valeurs des 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 ni comment votre application se comporte en concurrence, mais dans certains cas, cela n'est pas recommandé. Vous devez vous assurer que votre identifiant est unique.

Remarque supplémentaire: Hibernate nécessitera toujours un constructeur par défaut, comme indiqué dans documentation d'Hibernate . Afin d'éviter que vous (et peut-être d'autres programmeurs si vous concevez une API) d'instanciations de Role à l'aide du constructeur par défaut, déclarez-le simplement comme private.

4
matthaeus

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 la table. Examinez également la console pour connaître le code SQL Hibernate 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;
3
user2601995

Voici ce que j'ai fait pour résoudre simplement par 2 moyens:

  1. définit la colonne ID sous la forme int

  2. si vous utilisez génération automatique dans ID, ne définissez pas la valeur dans le paramètre de définition de l'ID. Si votre mappage, l'ID alors parfois autogenetated n'est pas concédé. (Je ne sais pas pourquoi)

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

3
jaskirat Singh