Hibernate映射:用复合外键关联Order与OrderList表是否正确?
你的配置存在部分合理点,但也有几个关键问题需要注意,具体如下:
复合主键关联的前提:
你在<list>的<key>节点中配置了applicationId和customerId两个外键字段,这要求Order表的主键必须是customerId+applicationId的复合主键。如果Order表使用的是单一主键(比如单独的orderId),那这个配置就不正确,因为无法用两个外键字段关联单一主键的表。<composite-element>的使用场景偏差:
你用<composite-element>映射OrderList,但OrderList本身是一张独立的数据库表,且有外键关联Order表,更适合将OrderList作为独立实体类,通过<one-to-many>关联配置(配合OrderList侧的<many-to-one>关联)。<composite-element>通常用于映射值对象(无独立主键,完全依赖主实体存在),如果OrderList需要被单独查询或维护,这种配置会带来极大限制。字段名与表名的匹配问题:
配置中的OrderPrice属性,要和数据库表OrderList里的Orderprice字段大小写完全一致(Hibernate对字段名大小写敏感,具体取决于数据库的大小写配置),不匹配会触发字段找不到的错误;另外配置里的表名是Order_List,但你的数据库表是OrderList,也需要确认两者是否一致,避免表不存在的异常。<list-index>的必填条件:
使用<list>集合必须搭配索引列,你配置的OrderListIndex字段必须在OrderList表中实际存在(类型通常为整数),否则Hibernate在插入、更新数据时会报错。
如果Order表确实是customerId+applicationId的复合主键,且OrderList不需要作为独立实体维护,同时上述字段名、表名、索引列都与数据库实际结构匹配,那这个配置可以正常工作;否则需要针对性调整。
内容的提问来源于stack exchange,提问作者DrunkDragon

