我有一个问题,想要解决使用注释,而不是两个不同的查询来获取数据。我需要用相同的列id连接两个不同的表。我有游记,在某些时候,游记中的行被擦除,但是现在TravelHistory(一个保存数据的表)中有需要保存的数据行(并且具有相同的id Travel…)有意义的)。在某些时候,Travel和TravelHistory可能会共存。
我想用相同的id映射两个不同的类(travel_id
是列的名称),类似于这样(代码简化):
@Entity
@Table(name = "travel_audit")
public class TravelAudit {
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "travel_id")
private Travel travel;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "travel_id")
private TravelHistory travelHistory;
}
但是Hibernate似乎不喜欢那样(有相同的name = "travel_id"
),所以我有错误创建Bean。
对于这个答案,我花了更多的精力和所有的细节,所以有更多的参考表:
@Column(name = "travel_id")
private Long travelId;
@OneToOne(targetEntity = Travel.class, fetch = FetchType.LAZY)
@JoinColumn(name = "travel_id", table = "travel")
private Travel travel;
@OneToOne(targetEntity = TravelHistory.class, fetch = FetchType.LAZY)
@JoinColumn(name = "travel_id", table = "travel_history")
private TravelHistory travelHistory;
但是没有成功。
之后,我想制作一个Optional<TravelAudit> findByTravelId(Long travelId);
并获得Travel和/或TravelHistory
我该怎么做?不幸的是,我认为我将不得不检索travel_id(它是一个长),并单独获得其他表。
错误是:
org.springframework.beans.factory。在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/hibernatejpacconfiguration .class]中创建名称为'entityManagerFactory'的bean时出错:调用init方法失败;嵌套异常是javex .persistence. persistenceexception: [PersistenceUnit: default]无法构建Hibernate SessionFactory
审计实体的映射可能是:
@Entity
@Table(name = "travel_audit")
public class TravelAudit {
@Id
@Column(name="travel_id")
private String travelId;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "travel_id", insertable=false, updatable=false)
private Travel travel;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "travel_id", insertable=false, updatable=false)
private TravelHistory travelHistory;
}
如果您使用JPA/Hibernate来生成DDL,您将需要确保没有为travel_audit生成约束。travel_id→旅行表引用,因为当你的应用程序试图删除仍然被旅行审计实例引用的旅行行时,它会被破坏。
拥有一个基本的映射(travelId)将允许您使用该值进行查询,而不必在两个表之间连接,并且使查询复杂化,因为默认的内部连接将破坏所需的逻辑。