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语句中。”