java - Hibernate/JPA 使用组合键连接两个表(无外部关系)

标签 java hibernate jpa

我对使用 JPA/Hibernate 相当陌生。我正在尝试找出使用复合键连接两个表且没有真正的数据库关系的最佳方法。

enter image description here

@Embeddable
public class StepPK implements Serializable{
    @Column(name = "step_id")
    protected String stepId;

    @Column(name = "packet_id")
    protected String packetId;
    ...
}


@Entity
@Table(name = "step_def")
@IdClass(StepPK.class)
public class InprocessPacketStep implements Serializable{

    @Id
    private String stepId;

    @Id
    private String packetId;

}


@Embeddable
public class StepDetailPK implements Serializable {
    @Column(name = "step_id")
    protected String stepId;

    @Column(name = "packet_id")
    protected String packetId;

    @Column(name="user_id")
    protected String userId;

    @Column(name="parallel_step_id")
    protected String parallelId;
    ...
}

@Entity
@Table(name = "step_detail")
@IdClass(StepDetailPK.class)
public class InprocessPacketStepDetail implements Serializable {

    @Id
    private String stepId;

    @Id
    private String packetId;

    @Id
    private String parallelId;

    @Id
    private String userId;
}

到目前为止,当单独从表中提取信息时,我所拥有的效果非常好,但我需要某种方法将它们加入到 step_id 上。由于实际上没有分配的关系,因此执行 OneToMany 和 JoinColumns 似乎不起作用。

我尝试过使用 ManyToMany,它在编译时不会崩溃,但在我的测试中检查后,它导致了 SQLGrammar 异常。

我唯一的想法是通过查询手动加入它们,但运行 entityManager.createQuery("select InprocessPacketStep step join inprocessPacketStepDetail d on d.stepId = step.stepId")导致运行时错误。

如有任何建议,我们将不胜感激。我花了很多时间在谷歌上搜索尝试不同的东西,但没有成功。

最佳答案

如果您的数据库架构不是遗留的,并且您可以更改它,那么@ManyToMany与附加关系表的关联应该可以解决问题: enter image description here

有很多examples在网络上流行的 JPA 2.x 实现框架(当然包括 Hibernate)

否则您应该尝试此线程中的解决方案: @ManyToMany without join table (legacy database)

关于java - Hibernate/JPA 使用组合键连接两个表(无外部关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36093667/

相关文章:

java - Android构建过程: using aapt on Resource files?

java - SSL 握手失败 - 这里可能出了什么问题?

java - Hibernate Search 空间构面查询首先运行 5 次,然后仅返回第 5 个结果

java - @Enumerated @ElementCollection 的命名策略

java - Selenium 测试用例中的循环 - java

java - 如何远程终止亚马逊EC2 Linux实例上的进程

postgresql - 重启 Spring Boot 应用程序后首次调用速度慢

jpa - 用于应用程序同步的数据库锁

java - JPA深度继承注解属性

java - Spring Data JPA 分页 - 从方法名称创建查询