这个类id必须调用save()之前手动分配:(ids for this class must be

2019-06-25 10:53发布

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

}

Answer 1:

@Entity类有一个String其类型@Id领域,所以它不能为您生成的ID。

如果您将其更改为在数据库中的自动增量和Long在Java中,并添加@GeneratedValue注释:

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

它会处理递增ID生成你。



Answer 2:

对于休眠重要的是要知道你的对象将有一个ID,当你想坚持/保存。 因此,确保

    private String U_id;

将有一个价值的时候你要坚持你的对象。 你可以做到这一点与@GeneratedValue注解或手动分配值。

在你需要或想要分配你的ID的手动(这就是上面的错误实际上是关于什么的)的情况下,我宁愿传递值的字段的构造,至少U_id ,如

  public Role (String U_id) { ... }

这样可以确保您的对象有一个ID,由你实例化它的时候。 我不知道你的使用情况是什么,你的应用程序的并发性的行为,但是,在某些情况下,不建议这样做。 你需要确保你的ID是唯一的。

此外,注意:Hibernate将仍然需要一个默认的构造函数,如信中注明Hibernate文档 。 为了防止你(也许其他程序员,如果你设计的API)的实例化Role使用默认的构造函数,只是声明为private



Answer 3:

下面是我做的,以通过2种方式只是解决:

  1. 使ID列int类型

  2. 如果您使用的是自动生成的ID不中ID的二传手assing值。 如果你映射了一些则有时autogenetated ID不concedered。 (我不知道为什么)

  3. 尝试使用@GeneratedValue(strategy=GenerationType.SEQUENCE)如果可能的话



Answer 4:

解决使用Oracle数据库定义的序列ID这个问题。

ORACLE_DB_SEQ_ID被定义为表中的一个序列。 也期待在控制台看到用来验证休眠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;


文章来源: ids for this class must be manually assigned before calling save():