Подтвердить что ты не робот

Ошибка гибернации: идентификаторы для этого класса должны быть назначены вручную перед вызовом 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]

Мой класс выглядит следующим образом:

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

}
4b9b3361

Ответ 1

Ваш класс @Entity имеет тип String для своего поля @Id, поэтому он не может генерировать идентификаторы для вас.

Если вы измените его на автоматическое приращение в БД и Long в java и добавьте аннотацию @GeneratedValue:

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

он будет обрабатывать возрастающее генерирование идентификатора для вас.

Ответ 2

Для спящего режима важно знать, что ваш объект будет иметь идентификатор, если вы хотите его сохранить или сохранить. Таким образом, убедитесь, что

    private String U_id;

будет иметь значение, к тому времени, когда вы собираетесь сохранить свой объект. Вы можете сделать это с помощью аннотации @GeneratedValue или путем присвоения значения вручную.

В случае, когда вам нужно или хотите назначить свой идентификатор вручную (и то, что на самом деле произошло выше), я предпочел бы передать значения для полей вашему конструктору, по крайней мере, для U_id, например

  public Role (String U_id) { ... }

Это гарантирует, что ваш объект имеет идентификатор, к тому времени, когда вы его создали. Я не знаю, что ваш вариант использования и как работает ваше приложение в concurrency, однако в некоторых случаях это не рекомендуется. Вы должны убедиться, что ваш идентификатор уникален.

Дальнейшее примечание: Hibernate все равно потребует конструктор по умолчанию, как указано в hibernate documentation. Чтобы не дать вам (и, возможно, другим программистам, если вы разрабатываете api) экземпляров Role с использованием конструктора по умолчанию, просто объявите его как private.

Ответ 3

Вот что я сделал, чтобы решить всего двумя способами:

  • введите столбец ID как int type

  • если вы используете autogenerate в ID, не оценивая значение в setter ID. Если ваш сопоставление некорректно идентифицирует некоторый, то иногда автогенерированный идентификатор. (Я не знаю почему)

  • попробуйте использовать @GeneratedValue(strategy=GenerationType.SEQUENCE), если возможно

Ответ 4

Устранена эта проблема, используя идентификатор последовательности, определенный в базе данных Oracle.

ORACLE_DB_SEQ_ID определяется как последовательность для таблицы. Также посмотрите на консоль, чтобы увидеть Hibernate SQL, который используется для проверки.

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