开发者社区> 问答> 正文

复合主键如何设置一个主键自动增长?报错

在Teacher类上注解了一个复合主键

@IdClass(TeacherPK.class)

将id和name设置为复合主键


@Id @GeneratedValue(strategy = GenerationType.IDENTITY) public int getId() { return id; }
@Id public String getName() { return name; }

我想让id自动增长,但是总是报错类型不匹配。

15:42:53,391 ERROR org.hibernate.property.BasicPropertyAccessor:118 - IllegalArgumentException in class: com.bjsxt.hibernate.TeacherPK, setter method of property: id
15:42:53,391 ERROR org.hibernate.property.BasicPropertyAccessor:122 - expected type: int, actual value: org.hibernate.id.IdentifierGeneratorHelper$2



表是建立成功的,但是无法插入数据,异常说是hibernate生成的类型是org.hibernate.id.IdentifierGeneratorHelper$2,和我teacherpk类中的id类型int不匹配。那么要如何装换过去?或者怎么解决我的问题?连得数据库是MySQL。


展开
收起
爱吃鱼的程序员 2020-06-14 18:34:31 698 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    复合主键的自动增长意义何在?

    IDENTITY是在原有值上累加一个数字,默认是1.

    回复 @firebroo:所以啊,无法默认进行数学运算的对象是无法默认自增的(大概)不知道有没有意义,初学hibernate,我知道identity的意思

    也是遇到这个问题,一直在纠结。

    查了一整天的资料了,最新的结果是复合主键可以实现自增,但保存后没有办法返回自增后的ID。数据库设计的字段自增长的,在保存时,new一个复合类型的主键,那个要自增的就不用设置值,:

    TestEntityte=newTestEntity();te.setPk_id(newAggId());dao.save(te);

    蛋疼的是没有返回。

    如果没有这方面的需求可以用用。

    现在想的方案只有自己维护主键了,但主键维护不易,考虑模仿使用Hibernate的GenerationType.Type模式,自己建一张主键维护表,需要主键时,自增一条这个表的记录,然后拿到他的自增ID作为主键设置进去,但这样一来每个复合主键都需要的话,不知道影不影响性能。因为我的框架里面,几乎所有的都是复合主键。



    2020-06-14 18:34:46
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RowKey与索引设计:技巧与案例分析 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多