当前位置: 首页 > 知识库问答 >
问题:

复合密钥部分的JPA连接

皇甫夕
2023-03-14

我尝试用JPA连接两个表

第一个表与实体ReportTripSing相关联第二个表与实体TripData相关联第二个表的主键用复合键(实体TripDataPK)描述

@Embeddable
public class TripDataPK implements Serializable {


    public TripDataPK() {
    }

    @Column(name = "FTP_ID", nullable = false)
    private long ftpId;

    @Column(name = "FTP_BATCH_ID", nullable = false)
    private long ftpBatchId;

    @Column(name = "FTP_DAY", nullable = false)
    private long ftpDay;

}
public class TripData implements java.io.Serializable {

    @EmbeddedId
    private TripDataPK tripDataPK;

    // some properties ...

}
public class ReportTripSingle implements java.io.Serializable {


    @Id
    @Column(name = "TRE_ID", precision = 10, scale = 0)
    private long id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "TRE_FTP_ID", referencedColumnName = "FTP_ID")
    private TripData   tripData;


}

如您所见,我想将ReportTripSingle与TripData结合起来

它不起作用:(

这是堆栈跟踪:

原因:组织。冬眠AnnotationException:com的referencedColumnNames(FTP\U ID)。nexo公司。苏珊。是模型ReportTripSingle。tripData引用com。nexo公司。苏珊。是模型TripData未映射到组织中的单个属性。冬眠cfg公司。活页夹帮助器。在org上创建SyntheticPropertyReference(BinderHelper.java:336)。冬眠cfg公司。ToOneFkSecondPass。doSecondPass(toonefksecondapass.java:116)位于org。冬眠cfg公司。配置位于组织的processEndOfQueue(Configuration.java:1522)。冬眠cfg公司。配置在org上处理FKSecondPassinOrder(Configuration.java:1443)。冬眠cfg公司。配置位于org的secondPassCompile(Configuration.java:1346)。冬眠cfg公司。配置buildSessionFactory(配置:1737)

实际上,TripData没有映射到单个属性,但我想加入FTP\U ID

当做

共有2个答案

颜昕
2023-03-14

我无法加入复合键的一部分。为了解决这个问题,我修改了与实体ReportTripSingle关联的表,添加了ftpBatchId和ftpDay作为外键

如果有人感兴趣,以下是我的实现:

实体报告TripSingle

public class ReportTripSingle implements java.io.Serializable {

@Id
@Column(name = "TRE_ID", precision = 10, scale = 0)
private long id;

@Column(name = "TRE_FTP_ID", length = 15, nullable = false, precision = 10, scale = 0, insertable = false, updatable = false)
private long tripDataId;

@Column(name = "TRE_BATCH_ID", nullable = false, insertable = false, updatable = false)
private long tripBatchId;

@Column(name = "TRE_FTP_DEP_DAY", nullable = false,insertable = false, updatable = false)
private long tripDay;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumns({
        @JoinColumn(name = "TRE_FTP_ID", referencedColumnName = "FTP_ID"),
        @JoinColumn(name = "TRE_BATCH_ID", referencedColumnName = "FTP_BATCH_ID"),
        @JoinColumn(name = "TRE_FTP_DEP_DAY", referencedColumnName = "FTP_DAY")

})
private TripData tripData;
}
戎俊
2023-03-14

更好的选择是在@Joincolumn中使用修饰符insertable=false和updateable=false,如中所述:https://dwuysan.wordpress.com/2012/02/22/joincolumn-is-part-of-the-composite-primary-keys

public class ReportTripSingle implements java.io.Serializable {


    @Id
    @Column(name = "TRE_ID", precision = 10, scale = 0)
    private long id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "TRE_FTP_ID", referencedColumnName = "FTP_ID", **insertable = false, updatable = false**)
    private TripData   tripData;

}
 类似资料:
  • 用户详细信息 有人能看出我做错了什么吗?

  • 问题内容: 我刚刚开始使用MongoDb,我注意到我有很多重复的记录,这些记录本来就是唯一的。我想知道如何对数据使用组合键,并且正在寻找有关如何创建它们的信息。最后,我使用Java来访问mongo和morphia作为我的ORM层,因此将您的答案中的内容包括在内是非常棒的。 Morphia:http : //code.google.com/p/morphia/ 问题答案: 您也可以将对象用于_id字

  • 我有以下两个类(和他们的pk类)与这些注释。我删除了setters/getters/hashcode/equals来压缩示例 我最终得到了这个错误 我的猜测是,因为“年”是在联接表中共享的,所以我弄乱了一些关联实体的语法。请注意,这些视图的实体之间存在隐式关系,我正试图在注释中对其建模。我尝试了一些JPA建模工具,这些工具在建模后给了我同样的错误。我已尝试将联接列设置为,并将设置为。 我当然可以只

  • 假设我有一个mongo集合,如下所示: 我想使用Spring的mongoTemplate编写一个查询,只检索那些id.index=index1的文档。 使用mongo shell,我可以编写以下查询: 然而,我认为使用mongoTemplate会起作用的东西却不起作用。我尝试过: 有人可以帮助我使用mongoTemplate为这个查询提供正确的语法吗?

  • 使用Spring数据REST和Spring数据JPA,我想更新聚合根上的子实体集合。举个例子,假设我有一个实体,它与实体有一对多的关系有自己的Spring数据存储库没有,因为它只能通过访问。 令人讨厌的是,由于现有的数据库设计,有一个复合键,包括的外键。因此,在没有双向关系的情况下,我无法找到将外键作为中复合键的一部分的方法,即使我不需要双向关系。 带有Lombok注释的类如下所示: 和评论: 以

  • notification_detail-单个主键 我想使用JPA持久化和读取这些对象,但无法使ManyToOne映射工作。 许多通知映射到一个notification_detail。 我试过所有类型的不同配置。我能想到的最好的办法是,我的情况很复杂,因为父对象“notification_detail_id”有一个复合键“notification_detail_id”,它也是子对象的主键。这使得Hi