有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在具有复合键的相关实体之间插入数据时发生java Hibernate错误

我正在尝试将数据插入@manytone关系端的实体中。两个表共享一个复合主键(尽管数据库根本没有任何约束)。我已将我的相关实体建模如下:

实体一:

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "EMP_GOALS_PHASES")
public class EmployeeGoalsAssessmentPhasesJPA implements Serializable {

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "APP_ID", referencedColumnName = "APP_ID"),
            @JoinColumn(name = "EMP_ID", referencedColumnName = "EMP_ID"),
            @JoinColumn(name = "CYCLE_ID", referencedColumnName = "CYCLE_ID"),
            @JoinColumn(name = "GOAL_ID", referencedColumnName = "GOAL_ID")
    })
    private EmployeeGoalsAssessmentJPA goalId;

    @Id
    @Column(name = "PHASE_ID")
    private Long phaseId;

    @Id
    @Column(name = "APP_ID")
    private Long appId;

    @Id
    @Column(name = "EMP_ID")
    private Long empId;

    @Id
    @Column(name = "CYCLE_ID")
    private Long cycleId;

    @Id
    @Column(name = "GOAL_ID")
    private Long goalIdentifier;

    @Column(name = "GOAL_RATE")
    private Double goalRate;

    @Column(name = "GOAL_WEIGHTED")
    private Double goalWeightedRate;

    @Column(name = "GOAL_COMMENT")
    private String goalComment;

    @Embedded()
    @AttributeOverrides({
            @AttributeOverride(name = "empId", column = @Column(name = "CREATED_BY")),
            @AttributeOverride(name = "creationDate", column = @Column(name = "CREATION_DATE")),
            @AttributeOverride(name = "updatedByEmpId", column = @Column(name = "LAST_UPDATED_BY")),
            @AttributeOverride(name = "lastUpdatedOn", column = @Column(name = "LAST_UPDATED_DATE")),
    })
    private ChangeHistory historyOfChanges;

第二实体:

@Builder
@AllArgsConstructor
@Entity
@Table(name="EMP_GOALS")
public class EmployeeGoalsAssessmentJPA implements Serializable{


    @Id
    @Column(name="APP_ID")
    private Long appId;

    @Id
    @Column(name="EMP_ID")
    private Long empId;

    @Id
    @Column(name="CYCLE_ID")
    private Long periodId;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "goals2019_generator")
    @SequenceGenerator(name="goals2019_generator", sequenceName = "GOALS2019_SEQ", allocationSize=25)
    @Column(name="GOAL_ID", nullable = false)
    private Long goalId;

    @Column(name = "GOAL_NAME")
    private String goalName;

    @Column(name="GOAL_DESC")
    private String description;

    @Column(name="GOAL_POSITION")
    private Long goalPosition;

    @Column(name="GOAL_MEASURE")
    private String goalMeasure;

    @Column(name="GOAL_WEIGHT")
    private Double goalWeight;

    @ManyToOne
    @JoinColumn(name = "MID_REV_STATUS_ID")
    private MidReviewStatusJPA midReviewStatus;

    @Column(name="MID_REV_COMMENT")
    private String midReviewComment;

    @OneToMany( mappedBy = "goalId", fetch = FetchType.EAGER)
    private Set<EmployeeGoalsAssessmentPhasesJPA> goalsAssessmentPhases = new HashSet<>();

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "empId", column = @Column(name = "CREATED_BY")),
            @AttributeOverride(name = "creationDate", column = @Column(name = "CREATION_DATE")),
            @AttributeOverride(name = "updatedByEmpId", column = @Column(name = "LAST_UPDATED_BY")),
            @AttributeOverride(name = "lastUpdatedOn", column = @Column(name = "LAST_UPDATED_DATE")),
    })
    private ChangeHistory historyOfChanges;

现在我想保存或更新EmployeeGoalsAssessmentPhasesJPA中的数据,它显然与EmployeeGoalsAssessmentJPA有关。问题是,每当我尝试这样做时,在保存过程中都会出现错误,说SqlExceptionHelper:142-索引13超出范围。我已经切换到hibernate的调试模式,并设法弄明白了这是怎么回事:

select
        employeego_.PHASE_ID,
        employeego_.GOAL_ID,
        employeego_.EMP_ID,
        employeego_.CYCLE_ID,
        employeego_.APP_ID,
        employeego_.GOAL_COMMENT as GOAL_COM6_11_,
        employeego_.CYCLE_ID as CYCLE_ID4_11_,
        employeego_.GOAL_ID as GOAL_ID2_11_,
        employeego_.EMP_ID as EMP_ID3_11_,
        employeego_.APP_ID as APP_ID5_11_,
        employeego_.GOAL_RATE as GOAL_RAT7_11_,
        employeego_.GOAL_WEIGHTED as GOAL_WEI8_11_,
        employeego_.CREATION_DATE as CREATION9_11_,
        employeego_.CREATED_BY as CREATED10_11_,
        employeego_.LAST_UPDATED_DATE as LAST_UP11_11_,
        employeego_.LAST_UPDATED_BY as LAST_UP12_11_ 
    from
        EMP_GOALS_PHASES employeego_ 
    where
        employeego_.PHASE_ID=? 
        and employeego_.GOAL_ID=? 
        and employeego_.EMP_ID=? 
        and employeego_.CYCLE_ID=? 
        and employeego_.APP_ID=?
Hibernate: 
    select
        employeego_.PHASE_ID,
        employeego_.GOAL_ID,
        employeego_.EMP_ID,
        employeego_.CYCLE_ID,
        employeego_.APP_ID,
        employeego_.GOAL_COMMENT as GOAL_COM6_11_,
        employeego_.CYCLE_ID as CYCLE_ID4_11_,
        employeego_.GOAL_ID as GOAL_ID2_11_,
        employeego_.EMP_ID as EMP_ID3_11_,
        employeego_.APP_ID as APP_ID5_11_,
        employeego_.GOAL_RATE as GOAL_RAT7_11_,
        employeego_.GOAL_WEIGHTED as GOAL_WEI8_11_,
        employeego_.CREATION_DATE as CREATION9_11_,
        employeego_.CREATED_BY as CREATED10_11_,
        employeego_.LAST_UPDATED_DATE as LAST_UP11_11_,
        employeego_.LAST_UPDATED_BY as LAST_UP12_11_ 
    from
        EMP_GOALS_PHASES employeego_ 
    where
        employeego_.PHASE_ID=? 
        and employeego_.GOAL_ID=? 
        and employeego_.EMP_ID=? 
        and employeego_.CYCLE_ID=? 
        and employeego_.APP_ID=?
2019-12-16 19:44:26,720 TRACE  BasicBinder:65 - binding parameter [1] as [BIGINT] - [30]
2019-12-16 19:44:26,720 TRACE  BasicBinder:65 - binding parameter [2] as [BIGINT] - [1900]
2019-12-16 19:44:26,720 TRACE BasicBinder:65 - binding parameter [3] as [BIGINT] - [57]
2019-12-16 19:44:26,720 TRACE BasicBinder:65 - binding parameter [4] as [BIGINT] - [201912]
2019-12-16 19:44:26,720 TRACE  BasicBinder:65 - binding parameter [5] as [BIGINT] - [1]

insert 
    into
        EMP_GOALS_PHASES
        (GOAL_COMMENT, CYCLE_ID, GOAL_ID, EMP_ID, APP_ID, GOAL_RATE, GOAL_WEIGHTED, CREATION_DATE, CREATED_BY, LAST_UPDATED_DATE, LAST_UPDATED_BY, PHASE_ID) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        EMP_GOALS_PHASES
        (GOAL_COMMENT, CYCLE_ID, GOAL_ID, EMP_ID, APP_ID, GOAL_RATE, GOAL_WEIGHTED, CREATION_DATE, CREATED_BY, LAST_UPDATED_DATE, LAST_UPDATED_BY, PHASE_ID) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

binding parameter [1] as [VARCHAR] - [TEST IF CHILD ENTITY ONLY GETS UPDATED IF PARENT IS UPDATED]
2019-12-16 19:44:26,779 TRACE  BasicBinder:65 - binding parameter [2] as [BIGINT] - [201912]
2019-12-16 19:44:26,779 TRACE  BasicBinder:65 - binding parameter [3] as [BIGINT] - [3750]
2019-12-16 19:44:26,779 TRACE  BasicBinder:65 - binding parameter [4] as [BIGINT] - [57]
2019-12-16 19:44:26,779 TRACE  BasicBinder:65 - binding parameter [5] as [BIGINT] - [1]
2019-12-16 19:44:26,779 TRACE  BasicBinder:65 - binding parameter [6] as [DOUBLE] - [8.0]
2019-12-16 19:44:26,779 TRACE  BasicBinder:65 - binding parameter [7] as [DOUBLE] - [26.6]
2019-12-16 19:44:26,779 TRACE  BasicBinder:65 - binding parameter [8] as [DATE] - [2019-12-16]
2019-12-16 19:44:26,779 TRACE BasicBinder:65 - binding parameter [9] as [BIGINT] - [57]
2019-12-16 19:44:26,780 TRACE  BasicBinder:65 - binding parameter [10] as [DATE] - [2019-12-16]
2019-12-16 19:44:26,780 TRACE  BasicBinder:65 - binding parameter [11] as [BIGINT] - [57]
2019-12-16 19:44:26,780 TRACE  BasicBinder:65 - binding parameter [12] as [BIGINT] - [30]
2019-12-16 19:44:26,780 TRACE BasicBinder:65 - binding parameter [13] as [BIGINT] - [1900]
2019-12-16 19:44:26,781 INFO   AbstractBatchImpl:193 - HHH000010: On release of batch it still contained JDBC statements
2019-12-16 19:44:26,781 WARN   SqlExceptionHelper:137 - SQL Error: 0, SQLState: S1093
2019-12-16 19:44:26,781 ERROR  SqlExceptionHelper:142 - The index 13 is out of range.

现在,显然这个索引13不是我表中的东西,那么为什么Hibernate要用它来插入数据呢?我不知道Hibernate是如何工作的。我认为我的模型也很混乱,因为组合键处理不当,但是我想了解那里发生了什么

业务目标很简单:能够为一个目标保存多个阶段,并在更新时进行更新。为了简洁起见,我省略了getter、setter、equals和hashCode。我的数据库是SQL Server


共 (0) 个答案