Pregunta

Al tratar de guardar un ID de mi clase padre en una clase hija, me siguen dando el error "ERROR - 'parent_id' El campo no tiene un valor por defecto"

He intentado todo tipo de asignaciones. Estoy utilizando anotaciones.

Cualquier ayuda en esto sería apreciada

Padres:

      @Id
      @Column(name="id")
      @GeneratedValue(strategy=GenerationType.AUTO)
      private long id;
      @Column(name="description")
      private String description;
      @OneToMany
      @Cascade(value= {org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE})
      @JoinColumn(name="parent_id")
      private List<Child> children;

Niño:

  @Id
  @Column(name="id")
  @GeneratedValue(strategy=GenerationType.AUTO)
  private long id;
  @Column(name="description")
  private String description;

Gracias.

¿Fue útil?

Solución

Debe tener algo mal en otro lugar porque esos mapeos funcionarán de la forma en que están. Podrían ser mejor, pero que van a trabajar. En concreto, todas las anotaciones @Column son redundantes e innecesarios, y como no Sequitor señaló, debe utilizar la propiedad cascada de @OneToMany de APP en lugar de @Cascade de Hibernate. He creado una ejemplo ejecutable con la versión limpiado en marcha de lo que usted envió. Si tiene Git y experto, se puede ejecutar con:

git clone git://github.com/zzantozz/testbed tmp
cd tmp
mvn -q compile exec:java \
    -Dexec.mainClass=rds.hibernate.UnidirectionalManyToOneJoinColumn \
    -pl hibernate-unidirectional-one-to-many-with-join-column

Crea un padre con dos hijos, los salva, y luego los carga e imprime el gráfico. La salida es:

Creating parent with two children
Loading saved parent
Parent{description='parent', children=[Child{description='child 2'}, Child{description='child 1'}]}

Otros consejos

Una adición tardía en caso de que alguien alguna vez se encuentra con el mismo problema.

Esta entidad aquí, cuando persistido usando Hibernate 4.1.8, cascada de los FieldChangeentities, sino que no llenar la columna de unión:

@Entity
public class Event {

    //ID and other fields here

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "event_id")
    private List<FieldChange<?>> fields = new ArrayList<FieldChange<?>>();

 }

Tampoco la instrucción de inserción establecer la columna event_id, ni tampoco actualiza la entidad insertada después del hecho - la event_id sigue siendo nula y se pierde la relación.

Sin embargo, si la definición @JoinColumn se cambia de esta manera:

@JoinColumn(name = "event_id", nullable = false)

, entonces la instrucción de inserción incluye la columna de la event_id como debería, y todo está bien.

Esto sólo puede ser una regresión en esta versión particular de hibernación, pero tal vez ayude a alguien.

En su proveedor JPA caso de persistir objeto hijo con su padre realizar al menos tres consultas sobre db. Los dos primeros persisten los objetos por su propia cuenta. El último actualizar objeto hijo con el padre de referencia de clave externa. La segunda consulta fallará porque tiene una restricción NOT NULL en la columna de clave externa. Tiene tres opciones:

  1. Eliminar restricción NOT NULL en la clave externa de la entidad secundaria
  2. Uso relación bidireccional
  3. Cambio proveedor de JPA a uno que apoya este tipo de casos.

Cambiar su @OneToMany a @OneToMany(cascade=CascadeType.ALL) utilizar JPA en lugar de las extensiones de Hibernate

Mi conjetura es que el @JoinColumn annotation necesita un referencedColumnName asignado.

@JoinColumn(name = "parent_id", referencedColumnName = "id")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top