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

Moja klasa jest tak:identyfikatory dla tej klasy musi zostać ręcznie przypisany przed wywołaniem 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; 
} 

} 

Odpowiedz

54

Twoja klasa @Entity ma String typ dla swojej @Id dziedzinie, więc nie może generować identyfikatory dla ciebie.

Jeśli zmienisz go do przyrostu auto w DB i Long w java i dodaj @GeneratedValue adnotacji:

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

będzie obsługiwać zwiększający generacji id dla Ciebie.

+2

Brakowało: @GeneratedValue (strategy = GenerationType.IDENTITY). Pomogło mi to. – sns

3

Dla hibernacji ważne jest, aby wiedzieć, że twój obiekt BĘDZIE miał identyfikator, kiedy chcesz go zachować/zapisać. W związku z tym upewnij się, że do czasu, w którym chcesz utrwalić obiekt, wartość będzie miała wartość. Możesz to zrobić za pomocą adnotacji @GeneratedValue lub przypisując wartość ręcznie.

W przypadku, gdy potrzebujesz lub chcesz przypisać swój identyfikator ręcznie (i o to właśnie chodzi w powyższym błędzie), wolałbym przekazać wartości dla pól do twojego konstruktora, przynajmniej dla U_id, np.

public Role (String U_id) { ... } 

Zapewnia to, że obiekt ma identyfikator, do czasu, gdy go utworzysz. Nie wiem, jaki jest twój przypadek użycia i jak twoja aplikacja zachowuje się we współbieżności, jednak w niektórych przypadkach nie jest to zalecane. Musisz upewnić się, że Twój identyfikator jest unikatowy.

Kolejna uwaga: Hibernacja nadal będzie wymagać domyślnego konstruktora, jak określono w hibernate documentation. Aby uniemożliwić Tobie (i innym programistom, jeśli projektujesz api) instancję Role przy użyciu domyślnego konstruktora, po prostu zadeklaruj go jako private.

2

Oto co zrobiłem, aby rozwiązać tylko przez 2 sposoby:

  1. make kolumna ID jako int typ

  2. jeśli używasz AutoGenerate Identyfikator dont assing wartość w setter ID. Jeśli twoje mapowanie niektórych, to czasami autogenetated ID nie jest stracone. (Nie wiem dlaczego)

  3. spróbuj @GeneratedValue(strategy=GenerationType.SEQUENCE) jeśli to możliwe

0

Rozwiązaliśmy ten problem przy użyciu identyfikatora sekwencji zdefiniowanej w bazie danych Oracle.

ORACLE_DB_SEQ_ID jest zdefiniowany jako sekwencja dla tabeli. Zobacz także konsolę, aby wyświetlić SQL Hibernate używany do weryfikacji.

@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; 
Powiązane problemy