尝试插入扩展实体时出错:列索引无效
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 = false
和updatable = false
之前这是默认设置。
【讨论】:
以上是关于尝试插入扩展实体时出错:列索引无效的主要内容,如果未能解决你的问题,请参考以下文章