我正在尝试在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)未映射到单个属性
谁能告诉我我做错了什么?谢谢
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你遇到的问题在于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应该能够正确解析RentalAgreement
到Rent
的关联关系,并理解如何基于复合键进行映射。