休眠:参数索引超出范围(8>参数个数,即7)

时间:2015-03-25 03:01:55

标签: java hibernate

不是此问题的重复Parameter index out of range (8 > number of parameters, which is 7)

我的SaltTranDef实体类是

@Id
@Column(name="salt_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer saltId;

@Column(name="tran_type")
private String transactionType;

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

@Column(name="parent_system")
private String parentSystem;

@Column(name="parent_sys_ref_id")
private String parentSystemReference;

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

@OneToMany(mappedBy = "saltTranDef")
@Cascade({ org.hibernate.annotations.CascadeType.ALL,
         org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private Set<SaltTranUser> saltTranUsers;

SaltTranUser实体类是

@Id
@Column(name="salt_id")
private Integer saltId;

@Id
@Column(name="salt_property")
private String saltProp;

@Column(name="salt_value")
private String saltValue;

@ManyToOne
@JoinColumn(name="salt_id")
private SaltTranDef saltTranDef;

上述两个实体类都扩展了mappedSuperclass

@Column(name="cre_suid")
private String creatorId;

@Column(name="mod_suid")
private String modifiedId;

@Column(name="cre_date")
private Timestamp creationDate;

@Column(name="mod_date")
private Timestamp modificationDate;

从JUnit插入时:

@Test
public void testInsert(){

    SaltTranDef std = new SaltTranDef();
    SaltTranUser stu1 = new SaltTranUser();
    SaltTranUser stu2 = new SaltTranUser();
    SaltTranUser stu3 = new SaltTranUser();
    Set<SaltTranUser> set1 = new HashSet<SaltTranUser>();

    Transaction tx = session.beginTransaction();

    std.setParentSystem("A");
    std.setParentSystemReference("123");
    std.setStatus(10);
    std.setTransactionType("A");
    std.setUserId("1234");
    std.setCreationDate(new Timestamp(new Date().getTime()));
    std.setCreatorId("1234");

    session.persist(std);
//  session.flush();

    stu1.setCreationDate(new Timestamp(new Date().getTime()));
    stu1.setCreatorId("1234");
    stu1.setSaltProp("Fname");
    stu1.setSaltValue("Swateek");
    stu1.setSaltId(std.getSaltId());

    stu2.setCreationDate(new Timestamp(new Date().getTime()));
    stu2.setCreatorId("1234");
    stu2.setSaltProp("Lname");
    stu2.setSaltValue("Jena");
    stu2.setSaltId(std.getSaltId());

    stu3.setCreationDate(new Timestamp(new Date().getTime()));
    stu3.setCreatorId("1234");
    stu3.setSaltProp("Phone");
    stu3.setSaltValue("9900056668");
    stu3.setSaltId(std.getSaltId());

    set1.add(stu1);
    set1.add(stu2);
    set1.add(stu3);

    std.setSaltTranUsers(set1);

    session.save(std);
    tx.commit();
}

我收到错误说:

  

严重:参数索引超出范围(8>参数个数,即7)。   2015年3月25日上午8:06:35 org.hibernate.event.def.AbstractFlushingEventListener performExecutions   严重:无法将数据库状态与会话同步   org.hibernate.exception.GenericJDBCException:无法插入:[com.salt.entity.SaltTranUser]       在org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)   引起:java.sql.SQLException:参数索引超出范围(8>参数个数,即7)。       在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)

4 个答案:

答案 0 :(得分:5)

这类问题几乎总是与双列映射有关。确实如此。我们可以看到,此映射使用了两列 "salt_id"

SaltTranUser实体类:

@Id
@Column(name="salt_id")
private Integer saltId;
...

@ManyToOne
@JoinColumn(name="salt_id")
private SaltTranDef saltTranDef;

这是错误的。 Hibernate最后插入一列两次,即INSERT,UPDATE

中的列更多参数

这里的解决方案非常简单 - 因为@ManyToOne似乎是错误的。我希望有一些特殊的专栏供参考: SaltTranDef_id

答案 1 :(得分:3)

当我使用单向映射(包含子类的父类,但子类不保留父类的引用)时,我遇到了同样的问题。 映射看起来像

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name="jobcard_id", nullable=false)
private List<JobServiceMapping> services;

我的错误参数索引超出范围。 然后我稍微更改了注释,现在它正在为我工​​作。

@OneToMany(mappedBy="jobcardId", cascade = CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval = true)
private List<JobServiceMapping> services;

答案 2 :(得分:1)

在我的案例中,问题是q(p) // query on 2D-BIT for point p which gives how many dots are in // rectangle represented by (0,0) and (p.x, p.y) result = q(pUR)-q(pUL)-q(pBR)+p(pBL) 字段。它被定义为鉴别者和公共财产。它没有用user_type标记但是Hibernate无论如何都失败了

@Column

答案 3 :(得分:0)

在您的实体中,替换

@ManyToOne
@JoinColumn(name="salt_id")
private SaltTranDef saltTranDef;

作者

@ManyToOne
@JoinColumn(name="salt_id", updatable = false, insertable = false)
private SaltTranDef saltTranDef;

对我有用