休眠:参数索引超出范围(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)
这类问题几乎总是涉及到双列映射。事实上。我们可以看到,这个映射使用一列两次"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
在我的情况下,问题是与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;
//...
}
休眠选取任何未标记为瞬态或用@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;
在@ @ ManyToOne'之前放置'@瞬间'对我来说工作正常。 – 2017-12-07 11:55:38