Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试插入扩展实体时出错:列索引无效_Java_Hibernate_Jpa_Observer Pattern_Jpa 2.1 - Fatal编程技术网

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

Java 尝试插入扩展实体时出错:列索引无效,java,hibernate,jpa,observer-pattern,jpa-2.1,Java,Hibernate,Jpa,Observer Pattern,Jpa 2.1,两个类有两个实体。第一个是第二个的扩展类(观察者模式): 孩子: @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorValue("User") @Table(name="SCH.USER") public class User extends Observer implements Serializable{ ...fields... } 父亲: @Entity @Inheritance(stra

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

@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

我非常肯定,这种行为改变是由JPA2.1升级产生的,克里斯是对的。当我从Jboss7升级到Wildfly10时,注意到了这个错误,并通过更新鉴别器进行了修复

@列(name=“INPUT_TYPE”,nullable=false,length=6,insertable=false,updateable=false) 公共字符串getInputType(){ 返回输入类型; }


我面临着同样的问题:

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

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

insertable=false
updateable=false


之前这是默认值。

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