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

k97glaaz  于 2022-12-17  发布在  Java
关注(0)|答案(1)|浏览(137)

我有一个问题,希望仅使用注解来解决,而不是使用两个不同的查询来获取数据。我需要使用相同的列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会话工厂

z9ju0rcb

z9ju0rcb1#

审计实体的Map可能是:

@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 -〉travel表引用生成约束,因为当您的应用尝试删除仍由travel审计示例引用的travel行时,它将被破坏。
有了基本的Map(travelId),就可以使用值进行查询,而不必在两个表之间进行连接,这样会使查询复杂化,因为默认的内部连接会破坏所需的逻辑。

相关问题