JPA/Hibernate启动报错无法识别java.util.Set类型问题求助
问题原因
错误核心是Book实体类中存在未添加JPA关联注解的集合类型字段publishers,Hibernate无法识别普通Java集合类型对应的数据库映射规则,所以抛出了类型映射错误。
你代码中还存在逻辑冲突:同时在Book类中定义了两个和Publisher关联的属性:
- 加了
@ManyToOne的单对象属性publisher:对应「一本书仅归属一个出版社」的业务逻辑 - 未加任何注解的
Set<Publisher> publishers:对应「一本书可归属多个出版社」的业务逻辑
两个属性逻辑冲突,且后者无JPA注解导致映射失败。
解决方案
根据你的业务需求二选一即可:
方案1:保留「一本书对应一个出版社」的逻辑(推荐,和你Publisher类的现有配置匹配)
直接删除Book类中多余的Set类型publishers字段及对应的get/set方法即可,删除的代码段如下:
private Set<Publisher> publishers = new HashSet<>(); public Set<Publisher> getPublishers() { return publishers; } public void setPublishers(Set<Publisher> publishers) { this.publishers = publishers; }
你Publisher类中已配置@OneToMany + @JoinColumn(name = "publisher_id"),Book类中保留的@ManyToOne private Publisher publisher可以和该配置完美匹配,双向关联正常生效。
方案2:改为「一本书对应多个出版社」的逻辑
如果业务确实需要多对多关联,删除Book类中多余的单对象publisher字段及对应get/set方法,给Set类型的publishers字段添加@ManyToMany关联注解即可:
// 删去这部分代码 @ManyToOne private Publisher publisher; public Publisher getPublisher() { return publisher; } public void setPublisher(Publisher publisher) { this.publisher = publisher; } // 给publishers字段加注解 @ManyToMany @JoinTable(name = "book_publisher", joinColumns = @JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "publisher_id")) private Set<Publisher> publishers = new HashSet<>();
同时需要修改Publisher类中的@OneToMany注解为@ManyToMany(mappedBy = "publishers"),删除原有的@JoinColumn配置。
内容的提问来源于stack exchange,提问作者moid tera3
相关产品推荐
相关产品推荐

