JPA配置OneToMany与ManyToOne双向关联时触发Hibernate AnnotationException求助
JPA配置OneToMany与ManyToOne双向关联时触发Hibernate AnnotationException求助
嗨,我帮你排查下这个双向关联的问题,你遇到的AnnotationException完全是因为几个配置细节没对齐,具体问题和修正方法如下:
核心问题:关联属性名称不匹配
你在Client类的@OneToMany注解里指定了mappedBy = "client",这意味着Hibernate要去关联的实体类里找名为client的属性,但你的Order类里定义的属性是private Client client_id;——属性名是client_id不是client,自然找不到对应的属性,这就是触发异常的直接原因。次要问题:实体类与泛型的拼写/大小写错误
从异常信息看,Hibernate找的目标实体是Ordini,但你贴的代码里是Order类,这里大概率是类名拼写不一致(比如你实际的实体类叫Ordini但代码里写的Order,或者反过来),必须保证@OneToMany关联的实体类和实际类名完全一致;另外Client类里的List<order> orderlist;泛型用了小写的order,要改成和实体类一致的大写Order(如果实体类是Order的话)。修正后的代码参考
先看修正后的Client类:@Entity public class Client { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private BigDecimal id; // 泛型修正为大写Order,mappedBy对应Order类的client属性,变量名优化为更规范的orders @OneToMany(mappedBy = "client", cascade = CascadeType.ALL) private List<Order> orders; // 别忘了添加无参构造函数、getter和setter方法 }再看修正后的
Order类(如果你的实体类实际是Ordini,把类名改成Ordini即可):@Entity @EntityListeners(AuditingEntityListener.class) public class Order implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private BigDecimal id; // 属性名改为client,和Client类mappedBy指定的名称完全匹配 @ManyToOne @JoinColumn(name = "client_id") // 这个是数据库列名,保持不变没问题 private Client client; // 同样需要添加无参构造函数、getter和setter方法 }额外提醒
JPA实体类必须要有无参构造函数,Hibernate实例化实体时会用到;另外双向关联建议两边都维护好关联关系(比如添加订单时,同时把订单设置到客户的订单列表里),避免出现数据不一致的情况。
内容来源于stack exchange
相关产品推荐
相关产品推荐

