【问题标题】:JPA composite primary key/foreign key mappingJPA 复合主键/外键映射
【发布时间】:2019-04-22 10:56:05
【问题描述】:

我有 2 张类似的桌子

然后我尝试使用@Embeddable 进行映射,例如This reference

Week_Effort.java

@Entity 
@IdClass(Week_Effort.class)
@Table(name = "week_effort")
public class Week_Effort implements Serializable  {

private static final long serialVersionUID = -2825819221813101109L;

@Id
@Column(name="week_id") 
private int week_id;

@Id
@Column(name="timesheet_id")
private int timesheet_id;

@Column(name="day1")
private int day1;

@ManyToOne(fetch = FetchType.LAZY ,cascade=CascadeType.ALL)
@JoinColumn(name="timesheet_id" , referencedColumnName =     "timesheet_id",insertable=false, updatable=false , foreignKey =   @ForeignKey(name = "fkweekts"))
private Timesheet timesheet_id ;
.
.
.
//get and set
}

Timesheet.java

@Entity
@Table(name = "timesheet")
public class Timesheet implements Serializable{

private static final long serialVersionUID = 7014333990749288304L;

@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "timesheet_id")
private int timesheet_id;

@OneToMany(mappedBy="timesheet_id" , cascade=CascadeType.ALL)
private Set<Week_Effort> weekeffort ;
.
.
.
//get and set 

}

WeekEmbed.java

@Embeddable
public class WeekEmbed implements Serializable {

private static final long serialVersionUID = 3229945076116848141L;

int timesheet_id;
int week_id;

//get set

}

我使用 AJAX 将参数作为 json 格式发布

{"timesheet_id":1,"day1":"8"} //and more 6 parameter

week_id 由某个进程生成,然后在 Jparepository 中使用 CRUD 添加之前设置它。但是错误

java.sql.SQLException: Parameter index out of range (10 > number of parameters, which is 9)

如何解决这个问题?我在这里做错了什么?

【问题讨论】:

  • 这是怎么回事? foreignKey = @ForeignKey(name = "fkweekts")
  • 它只是为 FK 命名。对编码无效。 @K.尼古拉斯
  • 我看你不需要这样的东西。您应该从一个更简单的设置开始 - 没有 @JoinColumn 注释并首先使其工作。我什至看不出你认为你在哪里使用你的复合键。

标签: java hibernate jpa


【解决方案1】:

发件人:Hibernate: Parameter index out of range (8 > number of parameters, which is 7)

我将 @IdClass 更改为 WeekEmbed.class 并删除一些部分,然后将 @Id 添加到对象映射中。

Week_Effort.java

@Entity 
@IdClass(WeekEmbed.class)
@Table(name = "week_effort")
public class Week_Effort implements Serializable  {

private static final long serialVersionUID = -2825819221813101109L;

@Id
@Column(name="week_id") 
private int week_id;

//Delete this part
//@Id
//@Column(name="timesheet_id")
//private int timesheet_id;

@Column(name="day1")
private int day1;

@Id
@ManyToOne(fetch = FetchType.LAZY )
@JoinColumn(name="timesheet_id" , referencedColumnName = "timesheet_id",insertable=false, updatable=false , foreignKey = @ForeignKey(name = "fkweekts"))
private Timesheet timesheet_id ;
.
.
.
//get and set
}

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 2017-02-21
    • 1970-01-01
    • 2011-03-20
    • 2016-09-18
    • 2015-02-03
    • 2021-09-19
    • 2018-11-28
    • 2020-10-04
    相关资源
    最近更新 更多