我有一个问题,希望仅使用注解来解决,而不是使用两个不同的查询来获取数据。我需要使用相同的列ID连接两个不同的表。我有Travels,在某些时候,Travel中的行会被擦除,但现在是TravelHistory(一个保存数据的表)有一行只包含需要保存的数据(并且有相同的ID Travel......是有意义的)。在某些时候,Travel和TravelHistory可能会共存。
我想让两个不同的类Map到相同的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时出现错误。
对于这个answer,我投入了更多的精力和所有细节,以便有更多的表参考:
@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.BeanCreationException:创建在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]中定义的名为“entityManagerFactory”的Bean时出错:调用init方法失败;嵌套异常为javax.persistence。持久性异常:[持久性单位:默认]无法构建Hibernate会话工厂
1条答案
按热度按时间z9ju0rcb1#
审计实体的Map可能是:
如果您使用JPA/Hibernate生成DDL,您需要确保没有为travel_audit.travel_id -〉travel表引用生成约束,因为当您的应用尝试删除仍由travel审计示例引用的travel行时,它将被破坏。
有了基本的Map(travelId),就可以使用值进行查询,而不必在两个表之间进行连接,这样会使查询复杂化,因为默认的内部连接会破坏所需的逻辑。