尝试插入扩展实体时出错:列索引无效

Posted

技术标签:

【中文标题】尝试插入扩展实体时出错:列索引无效【英文标题】:Error when trying to insert an extended entity: invalid column index 【发布时间】:2015-09-17 12:41:10 【问题描述】:

我有两个实体用于两个类。第一个是第二个的扩展类(观察者模式): 孩子:

@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 会产生这种行为变化

【问题讨论】:

升级前使用的 SQL 是什么?鉴别器映射不应该是只读的,因为它应该由Java继承控制吗?尝试将其标记为 insertable=false, updatable=false 请发布堆栈跟踪(至少相关部分)。并指定 Hibernate 版本。我猜想它与使用 DiscrimatorColumn 作为字段有关 - 我认为这在任何地方都没有明确支持(尤其是对于可修改的字段)。如果你真的需要读取鉴别器的值,你可以使用 @Formula 代替 - 或者你有一个为 Observer 的每个子类实现的方法 getDiscriminator()。而且您不需要定义 InheritanceType 两次 - 只需将它用于根实体。 你们俩都是对的!问题在于鉴别器映射。我添加了 insertable=false, updatable=false 并且它有效!如果可以的话,我会给你“最佳答案”检查。 insertable=false 很荒谬(尽管是正确的)。由于该值未在 DB 端定义,因此 in 必须作为 INSERT 的一部分。因此 insertable=false 没有意义 :) 在手册中查找此属性的 @Column:“该列是否包含在持久性提供程序生成的 SQL INSERT 语句中。” 【参考方案1】:

@Chris 是对的。当我从 Jboss7 升级到 Wildfly10 时,注意到这个错误并通过更新鉴别器修复

@Column(name = "INPUT_TYPE", nullable = false, length = 6, insertable = false, updatable = false) 公共字符串 getInputType() 返回输入类型;

【讨论】:

【参考方案2】:

我遇到了同样的问题:

错误 SqlExceptionHelper:146 - 列索引超出范围:2, 列数:1

当我升级JPA版本在鉴别器列中添加以下两个属性时:

insertable = falseupdatable = false

之前这是默认设置。

【讨论】:

以上是关于尝试插入扩展实体时出错:列索引无效的主要内容,如果未能解决你的问题,请参考以下文章

插入扩展抽象实体的实体时出错

PreparedStatement 中的列索引无效

匿名plsql块中的列索引无效[重复]

无效的列索引错误 - 无法解决问题

java.sql.SQLException:无效的列索引

与 FOSUserBundle 和易于扩展的自定义实体创建关系时出错