📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜
✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。
目录
问题描述
总结
分析
问题描述
Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'creatorName' in 'field list'
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
今天是有jpa遇到了一个坑,之前没有注意,今天进行了整理,总结一下JPA中的@Column写在属性和写在get方法上面的区别是什么。
总结
即在相应的数据库表里找不到creatorName字段。我觉得很奇怪。请教了大佬,然后查了一些别人的文章,现在做一下总结。
1、首先,我的字段名虽然起的符合一般规范,但应该是不符合JPA的命名规范的,不然也不会在映射时将“creatorName”映射成“creator_name”。
2、当时,我的@Id字段时写在id的属性上,而我的@Column(name = "creator_name")写在了get方法上,如下图:
而id属性写在属性上面
最后在进行保存的时候提示字段不存在。creatorName
分析
请教过大佬以后,才知道:虽然@Column可以写在属性上,也可以写在get方法上,但是它必须和@Id在同样的位置才会起效。即@Id在字段属性上,@Column也必须写在字段属性上,写在get方法上是不生效的。
有人可能会问,为什么我有的写在字段属性上,有的写在get方法上也不会报错,都会生效呢?
这大概是因为你的字段命名都是标准的驼峰式,所以jpa会按照既定的规则对你标准驼峰式的字段名进行拆解,虽然和@Id不在同样位置的@Column没有生效,但是因为你的字段名是标准驼峰式,那么JPA拆解后就能顺利找到你在数据库的字段了。但是我这个 名字估计是因为不符合JPA要求的命名规则,而且@Column和@Id不在同一位置上,所以导致@Column没有生效,然后JPA按照它自己的一套规则对我的creator_name进行转换,转成了“creatorName”,自然就在数据库找不到对应的字段了。
这里有一个点就是,如果你的命名是标准的符合JPA命名规范的驼峰式,那么你不写@Column也可以。我想@Column最大的作用就是,当你的实体类里某个属性的名字和数据库对应的字段名不一致时,可以用来告诉JPA这个属性在数据库表中的真实名字。例如:
当你在实体类里叫code的属性,对应的是数据库表中的num字段时,生效的@Column会告诉JPA这个code属性在数据库中的真实名字。
具体深入的掌握还需要对jpa的源码进行解读才能知道这个解析过程是如何进行的,这里进行简单的分析,后续专门再学习一下jpa的源码。
如果觉得本文对你有帮助,欢迎点赞,欢迎关注,如果有补充欢迎评论交流,我将努力创作更多更好的文章。