在insert语句中指定了两次的列

时间:2014-12-22 20:29:48

标签: jpa eclipselink

我有以下问题。

我有一个映射的超类:

@MappedSuperclass
public class MySuperClass {
  @Version
  private long version;
  private String foo;
  private String bar;
  // getter/setter omitted
}

和两个实体,第二个实体使用共享主键:

@Entity
public class MainEntity extends MySuperClass  {
  @Id @GeneratedValue
  private Long id;
  @OneToOne(mappedBy="main")
  private SecondaryEntity secondary;
  // getter/setter omitted
}

@Entity
public class SecondaryEntity extends MySuperClass  {
  @Id
  @OneToOne(optional=false)
  private MainEntity main;
  // getter/setter omitted
}

我所看到的是,当我尝试持久化SecondaryEntity实例时,EclipseLink会生成一个重复映射超类字段的SQL语句:

INSERT INTO SecondaryEntity ('field1', 'field2', 'version', 'foo', 'bar', 'field3', 'version', 'foo', 'bar', 'main_id') VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

当然,MySql抱怨:列'版本'指定了两次 (我认为它没有提及'foo'和'bar',因为它停在'版本',但它们也会重复出现。)

我做错了吗? EclipseLink中是否存在“共享主键”和“映射超类”组合的问题?

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题与使用"共享主键和#34;无关。和#34;映射的超类",而是SecondaryEntity有一个嵌入字段错误地扩展了相同的映射超类,因此EclipseLink试图在SQL插入中多次嵌入映射的超类属性查询。

无论如何,EclipseLink在建模阶段的任何阶段,启动时或从实体生成表时都没有产生错误或警告。我在EclipseLink Bugzilla中提交了bug 456054来跟踪这个问题。