当前位置: 首页 > 知识库问答 >
问题:

Hibernate保存实体,即使它们由于生成的ID而已经存在

王子明
2023-03-14

我正在与用户一起制作一个应用程序。用户有一个id,该id使用以下Hibernate注释自动分配:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id

这一切都很好,但问题是,每次我运行应用程序(同时添加同一个用户)时,它都会为用户分配一个新id,而不管该用户是否已经存在。

我该怎么做才能使现有用户在每次运行应用程序时都不会获得新id,而不必要求所有用户单独检查他们的用户名?

提前谢谢。

编辑

更多的一些代码示例(这里我只写相关的代码)。

用户:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    // more code here
}

带有save函数的用户hibernate类:(会话在Main中打开并提供给构造函数)。


public class UserDAOHibernate implements GebruikerDAO {
    private Session session;

    public UserDAOHibernate(Session session) {
        this.session = session;
    }

    @Override
    public boolean save(User user) {
        try {
            if (this.findById(user.getId()) == null) {
                Transaction transaction = session.beginTransaction();
                session.save(user);
                transaction.commit();
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    // more code here
}

上面的代码中,我根据id检查用户是否已经存在,因为用户不断获得新的id,所以这个函数检查是否存在id=2的用户,而已经存在的用户id=1。

在主:

// lots of code

User user = new User("Stijuh");

// more code here

UserDAOHibernate udao = new UserDAOHibernate(session);
udao.save(user);

共有1个答案

吕俊美
2023-03-14

如果要更新,在保存对象之前,必须设置id字段。这样Hibernate就不会生成新的

 类似资料:
  • 我有两个实体,我想保存到数据库中,付款和付款项。付款可以有更多的付款项目。 主要实体: 第二个实体: 所以,我用1个PaymentItem填充一个Payment,并尝试保存它。请注意,Payment没有自动生成的ID,我从其他地方获取ID并手动设置。 现在,当我试图保存它时,Hibernate会转到数据库,查看是否存在一个现有条目及其项(不是,数据库是空的)。 我知道这一点,因为我打开了Hiber

  • 我想保存一个学生,一个学生有一个TargetAudience对象作为属性。这些目标受众都已经在我的数据库中硬编码好了。(targetaudience=校园专业)。现在当我这样发帖时: 它不起作用,因为每次它为校园创建一个新对象,并且因为我使用名称作为主键,它都会抛出一个异常。spring data jpa不应该查看实体allready是否存在,然后使用它吗?或者我该怎么做? 抱歉我没说清楚这是我第

  • 我试图创建一个注册用户的功能。 我遵循了这篇文章中的建议:将空作为id保存,并Hibernate,但解决方案对我不起作用。这是我的用户类 这是我的账户类 我的日志显示了以下输出

  • 子类: 我将它保存在我的DAO中,如下所示: 当我试图保存对象ship,它会给我以下错误:

  • 我想保存两个实体的差异。旧实体有一个id女巫不是空的。新的id值为null,所以我将它们作为ValueObject进行比较。问题是ValueChange确实保存了差异,但没有保存旧的id。ich如何做到这一点?

  • 我是Hibernate的新手,并要求使用具有这些列的表的数据库 表:TBL _ product//库存项目列表< br >列:< br > key _ product < br > key _ category < br > fld _ product _ name < br > fld _ Inventory _ qty < br > fld _ unit _ price < br > fld