【问题标题】:JPA join on part of composite keyJPA 加入组合键的一部分
【发布时间】:2015-09-27 10:39:56
【问题描述】:

我尝试用 JPA 连接两个表

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

实体 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 ...

}

实体 ReportTripSingle

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;


}

如您所见,我想通过 TripData 加入 ReportTripSingle

它不起作用:(

这是堆栈跟踪:

引起:org.hibernate.AnnotationException: 引用的ColumnNames(FTP_ID) com.nexo.susan.be.model.ReportTripSingle.tripData 引用 com.nexo.susan.be.model.TripData 未映射到单个属性 org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:336) 在 org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:116) 在 org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1522) 在 org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1443) 在 org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1346) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)

确实 TripData 没有映射到单个属性,但我想加入 FTP_ID

问候。

【问题讨论】:

  • “它不起作用”是什么意思?能否提供一些错误日志、异常、不良行为?
  • 我已经重现了这个错误并添加了堆栈跟踪

标签: java jpa join composite


【解决方案1】:

更好的选择是在@Joincolumn 中使用修饰符 insertable = false 和 updatable = 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;

}

【讨论】:

    【解决方案2】:

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

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

    实体 ReportTripSingle

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 2012-03-02
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2020-07-13
      相关资源
      最近更新 更多