休眠:参数索引超出范围(8>参数的数量,这是7)

问题描述:

不是这个问题的重复Parameter index out of range (8 > number of parameters, which is 7)休眠:参数索引超出范围(8>参数的数量,这是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执行 SEVERE:无法同步数据库状态与会话 org.hibernate.exception.GenericJDBCException:无法插入:[com.salt.entity .SaltTranUser] at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103) 引起:java.sql.SQLException:参数索引超出范围(8>参数数量,即7)。 在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)

+0

在@ @ ManyToOne'之前放置'@瞬间'对我来说工作正常。 – 2017-12-07 11:55:38

这类问题几乎总是涉及到双列映射。事实上。我们可以看到,这个映射使用一列两次"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

+0

由于某些商业原因,我无法解决这个问题。 因此,在第二个表中,第一个表和另一个列的标识列将是复合主键。第二个表中的标识列将是依赖于第一个表的外键。 – swateek 2015-03-26 16:36:46

+0

将其标记为只读。但总的来说,我的答案是答案。一列的两个映射不能用作可写...希望它可以帮助 – 2015-03-26 16:49:10

+0

现在..随着实体类中的一些变化..(我已经完成了,只读)这个错误不会来。但是其他的东西即将出现,我很困惑,如果我应该编辑这个问题或开始一个不同的线程?请帮助。 – swateek 2015-03-26 16:54:57

在我的情况下,问题是与user_type字段。它被定义为鉴别者和公共财产。它没有标明@Column但不知何故,休眠反正没这个

@Entity 
@Table(
    name = "abstract_users", 
    indexes = {@Index(name = "idx__abstract_users__is_enabled", columnList = "is_enabled")} 
) 
@Access(AccessType.FIELD) 
@Inheritance(strategy = InheritanceType.JOINED) 
// @TODO: rename user_type to discriminator 
@DiscriminatorColumn(name = "user_type", discriminatorType = DiscriminatorType.STRING, length = 10) 
abstract public class AbstractUser extends CreateUpdateTimestampableBase 
{ 

    // @TODO: rename user_type to discriminator 
    public String user_type; 

    @Min(0) 
    @NotNull 
    @Column(precision = 19, scale = 2) 
    protected BigDecimal balance; 

    //... 
} 
+1

休眠选取任何未标记为瞬态或用@Transient注释的属性。这就是为什么user_type检测为数据库列。 – 2017-02-17 00:14:26

我面临同样的问题,当我使用含子类的单向映射(父类,但孩子上课不守参考的父类)。 映射看上去像

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