我有兩個類的兩個實體。首先是擴展類的第二(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
升級之前使用的SQL是什麼?鑑別器映射不應該是隻讀的,因爲它應該由Java繼承來控制?嘗試將其標記爲可插入= false,updatable = false – Chris
請發佈堆棧跟蹤(至少相關部分)。並指定Hibernate版本。我猜想它與使用DiscrimatorColumn作爲字段有關 - 我不認爲這是明確支持任何地方(特別是對於可修改的字段)。如果您確實需要讀取鑑別器值,則可以使用'@ Formula'來代替 - 或者您爲Observer的每個子類實現了一個方法'getDiscriminator()'。而且你不需要定義'InheritanceType'兩次 - 只將它用於根實體。 –
你們都是對的!問題在於鑑別器映射。我添加了insertable = false,updatable = false並且它可以工作!如果可以,我會給你「最佳答案」檢查。 – toscanelli