Pergunta

Estamos usando Hibernate Annotations 3.4.0GA e Hibernate Core 3.3.2.GA (também conhecido como as versões estáveis ​​atuais) em um banco de dados Oracle

Temos um mapeamento Um-para-Muitos com base = 1 que funcionou bem por muuuuito tempo, mas na semana passada encontramos algumas entradas no banco de dados onde a coluna do índice continha um valor 0, o que causou todos os tipos de problemas.

Então minha pergunta é:Alguém sabe uma maneira de obter o valor 0 na coluna de índice de um relacionamento um-para-muitos, quando ele é mapeado com base = 1?Possivelmente relacionado ao uso de genéricos ou MappedSuperclass.

Observe que o código é bastante complexo porque a herança também está envolvida.

A seguir estão as partes relevantes das aulas:

// 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;
}

As classes reais herdam destes e fornecem classes concretas para os parâmetros de tipo.Eles são mapeados como Entidade.Eles também especificam colunas de id e versão, bem como vários outros atributos e referências, mas nada relacionado ao mapeamento em questão.

Foi útil?

Solução

Eu sei que já se passaram quase dois anos, mas me deparei com isso enquanto procurava uma solução para o mesmo problema.Estamos usando o hbm por meio de arquivos xml, então não tenho certeza se isso vai ajudar.No nosso caso o problema era o mapeamento reverso.Se o controle sobre a lista (e o índice) estivesse no lado do elemento da lista (os "muitos"), como no seu caso, tivemos o problema.Mover para cima resolveu isso.Não sei como isso é feito com anotações.

Outra fonte do erro pode ser se você realmente definir "elementos" em seu objeto AbstractReihung.O Hibernate usa objetos proxy para propriedades de carregamento lento.Se você definir uma coleção totalmente nova em vez de modificar a existente, você substituirá o objeto proxy.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top