2015-03-25 55 views
3

不是這個問題的重複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

回答

4

這類問題幾乎總是涉及到雙列映射。事實上。我們可以看到,這個映射使用一列兩次"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

0

在我的情況下,問題是與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

1

我面臨同樣的問題,當我使用含子類的單向映射(父類,但孩子上課不守參考的父類)。 映射看上去像

@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; 
相關問題