2015-09-17 53 views
0

我有兩個類的兩個實體。首先是擴展類的第二(Observer模式)的: 孩子:嘗試插入擴展實體時出錯:無效列索引

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorValue("User") 
@Table(name="SCH.USER") 
public class User extends Observer implements Serializable{ 
    ...fields... 
} 

與父:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING) 
@Table(name="SCH.OBSERVER") 
public abstract class Observer implements Serializable{ 

    @Id 
    @SequenceGenerator(name = "OBSERVER_ID_GENERATOR", sequenceName = "NEXO.SEQ_OBSERVER", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "OBSERVER_ID_GENERATOR") 
    @Column(name="ID_OBSERVER") 
    private Long idObserver; 

    @Column(name = "DISCRIMINATOR", nullable=false, length=20) 
    private String discriminator; 
} 

自從我升級JPA 2.0 JPA 2.1我不能堅持子實體: em.persist(userInstance); 產生下一個SQL:

insert 
into 
    NEXO.OBSERVER 
    (DISCRIMINATOR, ID_OBSERVER) 
values 
    ('User', ?) 

,並得到所產生的誤差:

java.sql.SQLException: invalid column index 

我很肯定這種行爲的變化已被升級產生的JPA 2.1

+1

升級之前使用的SQL是什麼?鑑別器映射不應該是隻讀的,因爲它應該由Java繼承來控制?嘗試將其標記爲可插入= false,updatable = false – Chris

+0

請發佈堆棧跟蹤(至少相關部分)。並指定Hibernate版本。我猜想它與使用DiscrimatorColumn作爲字段有關 - 我不認爲這是明確支持任何地方(特別是對於可修改的字段)。如果您確實需要讀取鑑別器值,則可以使用'@ Formula'來代替 - 或者您爲Observer的每個子類實現了一個方法'getDiscriminator()'。而且你不需要定義'InheritanceType'兩次 - 只將它用於根實體。 –

+0

你們都是對的!問題在於鑑別器映射。我添加了insertable = false,updatable = false並且它可以工作!如果可以,我會給你「最佳答案」檢查。 – toscanelli

回答

1

@克里斯是對。當我從Jboss7升級到Wildfly10,注意到了這個錯誤,並通過更新鑑別

@Column(name = "INPUT_TYPE", nullable = false, length = 6, insertable = false, updatable = false) public String getInputType() { return inputType; }

0

固定我面臨同樣的問題:

ERROR SqlExceptionHelper:146 - The column index is out of range: 2, number of columns: 1

當我升級了JPA版,增加了以下兩個屬性的鑑別列:

insertable = falseupdatable = false

早些時候,這是默認的。

相關問題