Fehler im Ruhezustand: IDs für diese Klasse müssen manuell zugewiesen werden, bevor save () aufgerufen wird:

70
Auslöser: org.springframework.orm.hibernate3.HibernateSystemException: IDs für diese Klasse müssen vor dem Aufruf von save () manuell zugewiesen werden: com.rfid.model.Role; Verschachtelte Ausnahme ist org.hibernate.id.IdentifierGenerationException: IDs für diese Klasse müssen manuell zugewiesen werden, bevor save (): com.rfid.model.Role aufgerufen wird
    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)
    unter com.wfos.engine.wrapper.domain.impl.WrapperImpl.save (WrapperImpl.java:159)
    ... 47 mehr
    Auslöser: org.hibernate.id.IdentifierGenerationException: IDs für diese Klasse müssen manuell zugewiesen werden, bevor save (): com.rfid.model.Role aufgerufen wird
    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 mehr
    WARNUNG [21:14:21] (CommonsLoggingOutput.java:59): - --Erroring: batchId [1] message [java.lang.reflect.UndeclaredThrowableException]

Meine Klasse ist wie folgt:

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

}
程序 猿
quelle

Antworten:

106

Ihre @EntityKlasse hat einen StringTyp für ihr @IdFeld, sodass sie keine IDs für Sie generieren kann.

Wenn Sie es in ein automatisches Inkrement in der Datenbank und ein Longin Java ändern und die @GeneratedValueAnmerkung hinzufügen :

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

Es wird die inkrementelle ID-Generierung für Sie übernehmen.

Böhmisch
quelle
7
Mir fehlte: @GeneratedValue (Strategie = GenerationType.IDENTITY). Es hat mir geholfen.
Sns
1
Dies sollte von OP als die richtige Antwort markiert werden. Meine anderen Entitäten haben keine @ GeneratedValue-Annotation, aber sie funktionieren. Sie mussten diese nur einer Entität hinzufügen. seltsam. aber trotzdem danke!
Jero Dungog
Danke für die Antwort. Es muss auch nicht Longin Java sein, es kann seinInteger
Jonathan Lee
4

Für den Ruhezustand ist es wichtig zu wissen, dass Ihr Objekt eine ID hat, wenn Sie es beibehalten / speichern möchten. Stellen Sie also sicher, dass

    private String U_id;

wird einen Wert haben, wenn Sie Ihr Objekt beibehalten. Das kannst du mit dem machen@GeneratedValue Anmerkung oder durch manuelles Zuweisen eines Werts .

Für den Fall, dass Sie Ihre IDs manuell zuweisen müssen oder möchten (und darum geht es bei dem obigen Fehler tatsächlich), würde ich es vorziehen, die Werte für die Felder an Ihren Konstruktor zu übergeben, zumindest für U_idz

  public Role (String U_id) { ... }

Dadurch wird sichergestellt, dass Ihr Objekt zum Zeitpunkt der Instanziierung eine ID hat. Ich weiß nicht, was Ihr Anwendungsfall ist und wie sich Ihre Anwendung gleichzeitig verhält. In einigen Fällen wird dies jedoch nicht empfohlen. Sie müssen sicherstellen, dass Ihre ID eindeutig ist.

Weiterer Hinweis: Für den Ruhezustand ist weiterhin ein Standardkonstruktor erforderlich, wie in der Dokumentation zum Ruhezustand angegeben . Um zu verhindern, dass Sie (und möglicherweise andere Programmierer, wenn Sie eine API entwerfen) Instanziierungen für die RoleVerwendung des Standardkonstruktors vornehmen, deklarieren Sie ihn einfach als private.

matthaeus
quelle
4

Dieses Problem wurde mithilfe einer in der Oracle-Datenbank definierten Sequenz-ID behoben.

ORACLE_DB_SEQ_IDist als Sequenz für die Tabelle definiert. Sehen Sie sich auch die Konsole an, um das zur Überprüfung verwendete Hibernate SQL anzuzeigen.

@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;
user2601995
quelle
Für mich unique = true, nullable = falsewar das notwendig, da das DB-Schema so war. Nur spezifizieren @Id& @GeneratedValuehat bei mir nicht funktioniert. Vielen Dank.
Sabir Khan
3

Folgendes habe ich getan, um es auf zwei Arten zu lösen:

  1. ID-Spalte als intTyp festlegen

  2. wenn Sie mit Autogenerate in ID nicht in dem Setter von ID assing Wert. Wenn Sie die einige dann manchmal autogenetated ID zuordnen, wird nicht eingeräumt. (Ich weiß nicht warum)

  3. versuchen Sie es @GeneratedValue(strategy=GenerationType.SEQUENCE)wenn möglich

Jaskirat Singh
quelle