Java Hibernate JPA创建一个实体,并连接由同一列引用的两个不同的表,具有相同的列名



我有一个问题,想要解决使用注释,而不是两个不同的查询来获取数据。我需要用相同的列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)将允许您使用该值进行查询,而不必在两个表之间连接,并且使查询复杂化,因为默认的内部连接将破坏所需的逻辑。

最新更新