开发者社区 问答 正文

带有@EmbeddedId的Spring-Data @oneToMany无法映射到单个属性

我正在尝试在Rent表和RentAgreement表之间建立oneToMany关系,rent表具有复合键rentKey

@Setter
@Getter
@Entity
@Table(name = "Rent")
public class Rent {

    @EmbeddedId
    @Column(name = "rentKey")
    private RentKey rentKey;

    @OneToMany(mappedBy="rent", cascade = {CascadeType.REFRESH, CascadeType.REMOVE})
    @JsonIgnoreProperties(value = "rent", allowSetters=true)
    private Set<RentalAgreement> rentalAgreements;
...

RentKey是

@Data
@Setter
@Getter
@Embeddable
public class RentKey implements Serializable{
    private String rentStartDate;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "agent_id", referencedColumnName = "id")
    @JsonIgnoreProperties(value = "rents", allowSetters=true)
    private Agent agent;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "client_id", referencedColumnName = "id")
    @JsonIgnoreProperties(value = "rents", allowSetters=true)
    private Client client;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "propertyRent_id", referencedColumnName = "id")
    @JsonIgnoreProperties(value = "rents", allowSetters=true)
    private PropertyRent propertyRent;
    ...

而RentAgreement是

@Data
@Entity
@Table(name = "RentalAgreement")
public class RentalAgreement {
    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name="agent_id", referencedColumnName="agent_id"),
            @JoinColumn(name="client_id", referencedColumnName="client_id"),
            @JoinColumn(name="propertyRent_id", referencedColumnName="propertyRent_id")
    })
    @JsonIgnoreProperties(value = "rentalAgreements", allowSetters=true)
    private Rent rent;
    ...

当我运行代码时,我得到

org.hibernate.AnnotationException:引用com.mikason.PropView.dataaccess.commercialEntity.Rent的com.mikason.PropView.dataaccess.documentEntity.RentalAgreement.rent的referencedColumnNames(agent_id,client_id,propertyRent_id)未映射到单个属性

谁能告诉我我做错了什么?谢谢

展开
收起
垚tutu 2019-12-04 16:38:00 877 分享 版权
阿里云 AI 助理回答

你遇到的问题在于Hibernate无法识别RentalAgreement实体中@ManyToOne注解的复合外键映射方式。在你的设置中,Rent类使用了一个嵌入式复合主键RentKey,而你在RentalAgreement类中尝试直接通过多个列映射到这个复合主键,但没有正确地指定它们应该映射到RentKey中的哪些属性。

为了解决这个问题,你需要调整RentalAgreement类中的映射,确保它明确地指向RentKey内的每个属性。由于复合主键不能直接作为单个引用列处理,你需要将复合键视为一个整体进行映射。这里是一个修改后的示例:

@Data
@Entity
@Table(name = "RentalAgreement")
public class RentalAgreement {
    @Id
    @GeneratedValue
    private Long id;

    // 修改关联映射以匹配RentKey的结构
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name="agent_id", referencedColumnName="agent_id", insertable=false, updatable=false),
            @JoinColumn(name="client_id", referencedColumnName="client_id", insertable=false, updatable=false),
            @JoinColumn(name="propertyRent_id", referencedColumnName="propertyRent_id", insertable=false, updatable=false)
    })
    @JsonIgnoreProperties(value = "rentalAgreements", allowSetters=true)
    private Rent rent;
    ...
}

注意几点关键修改: 1. 添加了insertable=false, updatable=false@JoinColumn注解中。这是因为当处理复合主键时,这些字段不应该直接参与插入或更新操作,它们是通过与Rent实体的关系来间接管理的。 2. 确保referencedColumnName值与RentKey中定义的列名相匹配。

这样修改后,Hibernate应该能够正确解析RentalAgreementRent的关联关系,并理解如何基于复合键进行映射。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: