Hibernate中session使用save(Object)方法中持久化不设置自增长属性的处理

本文探讨了在使用Hibernate框架处理自动增长ID时遇到的问题,通过检查配置和使用*.hbm.xml方式解决了ID生成策略的配置问题。强调了基础配置的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

  在开发过程中可能需要用到对一个对象的存储操作,这个对象的主键(本例子为ID,以下ID都是指主键)恰好又是自动增长方式,而后可能会用到ID,遇到这种情况首先想到的是再在数据库中查询一次,但深思发现此思路有不合理之处,而后就考虑从Hibernate提供的session当中找有没有相应的处理方式(毕竟是一个相当优秀的框架),然后通过百度查找到一些文章,上面有说在Hibernate执行save操作之后本身就会对传入的对象进行持久化操作,会设置其主键(基础没有打好的原因,= =),直接调用对象的getId()方法就可获得Id。

  好的那么问题就来了,我无论怎么getId()就是的不到自增长的id ,下面是我的代码

Entity类:

    @Id
    @Column(name = "id", nullable = false, insertable = true, updatable = true)
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

*.hbm.xml

<id name="id">
            <column name="id" sql-type="int" not-null="true"/>
</id>

JUnitTest代码

    @Test
    public void TestSaveId(){
        UserEntity user = new UserEntity();
        user.setName("123");
        save(user);
        System.out.println(user.getId());
    }

    private void save(UserEntity user){
        Session session = HibernateSessionFactory.getSession();
        session.getTransaction().begin();
        session.save(user);
        session.getTransaction().commit();
        HibernateSessionFactory.closeSession();
    }

  于是各种百度,在setId查看值,发现在save时Hibernate会调用对象的set方法,检查set的值后发现是0,并不是自增加后的数据,于是想到可能是配置的原因,检查配置和Annotation发现部分用户会设置@GeneratedValue方式来指定ID的生成策略,不知道是人品原因还是设置方式错误,就是没有效果= o =。

  好的因为是在图书馆,那么呢,就要发挥一下图书馆的地理优势,找了一本Hibernate的书籍,讲到配置id的生成策略,是用得*.hbm.xml方式来配置的,心想,好吧,既然注解不行那就试一试最传统的方式来试一试吧,添加代码

<id name="id">
            <column name="id" sql-type="int" not-null="true"/>
            <generator class="native"/>
</id>

发现竟然成功了,好吧,说了这么多废话具体原因大概就是配置原因。因为我是用得Intellij Idea反向工程自动生成的Bean,图方便嘛,看来还是要好好的把基础打好。

转载于:https://www.cnblogs.com/moonou/p/4479982.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值