Hibernate IndexColumn中的值0,以base = 1映射

时间:2010-03-03 09:56:20

标签: java hibernate generics one-to-many mappedsuperclass

我们正在针对Oracle数据库使用Hibernate Annotations 3.4.0GA和Hibernate Core 3.3.2.GA(也称为当前稳定版本)

我们有一个一对多的映射,其中base = 1在一段时间内工作正常,但是上周我们在数据库中发现了一些条目,其中索引列包含值0,这导致了各种问题。

所以我的问题是:当用base = 1映射时,是否有人知道如何将值0引入一对多关系的索引列?可能与使用泛型或MappedSuperclass有关。

请注意,代码相当复杂,因为还涉及继承。

以下是课程的相关部分:

// SuperClass of the One side
@MappedSuperclass
public abstract class AbstractReihung<Tp, Tw, Te extends AbstractReihungElement<Tp, Tw>>
{
  @OneToMany(cascade = CascadeType.ALL)
  @Cascade(
  {
      org.hibernate.annotations.CascadeType.ALL,
      org.hibernate.annotations.CascadeType.DELETE_ORPHAN
  })
  @JoinColumn(name = "parent_id", nullable = false)
  @IndexColumn(name = "position", base = 1, nullable = false)
  private List<Te> elements = new ArrayList<Te>();
}

// Super Class of the Many side
@MappedSuperclass
public abstract class AbstractReihungElement<Tp, Tw> extends AbstractDbObject
{
  @ManyToOne
  @JoinColumn(name = "parent_id", insertable = false, updatable = false, nullable = false)
  private Tp parent;

  @Column(name = "position", insertable = false, updatable = false, nullable = false)
  private int position;
}

实际的类继承自这些类,并为类型参数提供具体的类。它们被映射为实体。它们还指定了id和version列以及大量其他属性和引用,但没有任何与手头映射相关的内容。

1 个答案:

答案 0 :(得分:2)

我知道已经差不多两年了,但我在寻找同样问题的解决方案时偶然发现了这一点。我们通过xml文件使用hbm,所以我不太确定这是否有用。 在我们的例子中,问题是反向映射。如果对列表(和索引)的控制是在列表元素一侧(“很多”),就像在你的情况下我们遇到了问题。提起它解决了这个问题。不知道注释是如何完成的。

如果您在AbstractReihung对象上实际设置“元素”,则错误的另一个来源可能是。 Hibernate使用代理对象来处理延迟加载的属性。如果您设置了一个完整的新集合而不是修改现有集合,则会覆盖代理对象。