87
引起:org.springframework.orm.hibernate3.HibernateSystemException:这个类的ids必须在调用save()之前手动分配:com.rfid.model.Role; 嵌套异常是 org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 id:com.rfid.model.Role
    在 org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676)
    在 org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    在 org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
    在 org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    在 org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:748)
    在 com.wfos.engine.wrapper.domain.impl.WrapperImpl.save(WrapperImpl.java:159)
    ... 47 更多
    原因:org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 id:com.rfid.model.Role
    在 org.hibernate.id.Assigned.generate(Assigned.java:53)
    在 org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
    在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
    在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    在 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)
    在 org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
    ... 50 更多
    警告 [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;
}

}
4

9 回答 9

136

@Entity的类的字段具有String类型@Id,因此它无法为您生成 id。

如果将其更改为 DB 中的自动增量和Longjava 中的 a,并添加@GeneratedValue注释:

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

它将为您处理递增的 id 生成。

于 2012-06-12T13:36:54.673 回答
9

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

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;
于 2017-04-05T20:26:41.580 回答
4

对于休眠,重要的是要知道您的对象将有一个 id,当您想要持久/保存它时。因此,请确保

    private String U_id;

将有一个值,当你要坚持你的对象。您可以使用@GeneratedValue注释或手动分配值来做到这一点。

如果您需要或想要手动分配您的 id(这就是上述错误的实际含义),我更愿意将字段的值传递给您的构造函数,至少对于U_id,例如

  public Role (String U_id) { ... }

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

进一步说明:Hibernate 仍然需要一个默认构造函数,如hibernate 文档中所述。为了防止您(可能还有其他程序员,如果您正在设计一个 api)Role使用默认构造函数的实例化,只需将其声明为private.

于 2013-02-21T09:44:19.040 回答
3

这是我通过两种方式解决的问题:

  1. 将 ID 列设为int类型

  2. 如果您在 ID 中使用自动生成,请不要在 ID 的设置器中分配值。如果您的映射有时不承认自动生成的 ID。(我不知道为什么)

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

于 2013-02-28T08:46:30.323 回答
0

从 UI 你必须传递 ID(主键)然后观察者你正在保存或更新,如果你正在保存使用 save 方法或使用 saveOrUpdate 方法

于 2021-09-09T08:06:51.950 回答
0

如果您想像 JSON 或其他方式手动提供 id 的值,您可以在 U_id 变量之前添加 @JsonProperty(" U_id") 符号

于 2021-08-20T19:15:46.173 回答
0

将 entity.hbm.xml 中的类字段值更改为身份或序列

<hibernate-mapping>
<class name="models.Manager" table="Managers">
    <id name="id">
        <generator class="identity"></generator>
    </id>
    <property name="name"></property>
    <property name="surname"></property>
    <property name="department"></property>
    <property name="project_id"></property>
</class>

如果您的实体 ID 仍然没有这些代码,请添加:

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)

对我有用

于 2022-02-23T23:30:31.837 回答
0

当数字 id 值的类型不匹配时,H2 数据库出现此错误。通过多个 sql 语句生成和填充表,并将 id 设置为 INT。后来创建了 Entity Java 类并将 id 设置为 Long。调整 Java 类中的 id 类型后问题已解决。

于 2021-06-08T04:14:21.147 回答
0

对于不同的场景,我得到了同样的错误。在我的情况下,我的表主键是一个 VARCHAR 值,所以在实体类(Entity1)中,ID 是一个字符串值,不能将其设置为自动生成。该实体也与另一个实体(Entity2)连接。

当我在更新 Entity2 并调用 save() 时将 Entity1 的值设置为空时,它会抛出此异常。为 id 设置空字符串不起作用。

Entity2 e2 = new Entity2();

Entity1 e1 = new Entity1();
e1.setId("");
e2.setEntity1(e1);

session.update(e2);

为 id 设置 null 也不起作用。

Entity2 e2 = new Entity2();

Entity1 e1 = new Entity1();
e1.setId(null);
e2.setEntity1(e1);

session.update(e2);

这样就可以了。

Entity2 e2 = new Entity2();
e2.setEntity1(null);
session.update(e2);
于 2022-02-25T12:34:06.530 回答