EntityManager falla para crear una instancia utilizando JPA / Hibernate cuando agrego una anotación de OneToMany

StackOverflow https://stackoverflow.com/questions/1947627

Pregunta

He estado luchando con no ser capaz de tener la EntityManager una instancia cuando agrego una columna OneToMany a una clase que ya tiene una columna OneToMany.

En este momento el EducationInfo tiene una OneToOne al usuario, ya que cada fila será única para una persona, pero quiero ser capaz de cargar toda la información de educación dado un nombre de usuario.

No estoy cambiando el archivo orm.xml cuando agrego la columna, acabo de soltar la base de datos para que pueda ser recreada.

class User {
  @Id
  @GeneratedValue(){val strategy = GenerationType.AUTO}
  var id : Int = _

  @Column{val nullable = false, val length=32}
  var firstName : String = ""
  var lastName : String = ""

  @Column{val nullable = false, val unique = true, val length = 30}
  var username : String = ""

  @OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL)}
  var address : java.util.List[Address] = new java.util.ArrayList[Address]()

  @OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL), val mappedBy="user"}
  var educationInfo : java.util.List[EducationInfo] = new java.util.ArrayList[EducationInfo]()

Si no incluyo la última columna entonces mi prueba de la unidad funciona bien, pero si incluyo esto, entonces todas mis pruebas de unidad falle.

Esta es la clase que está tratando de usar, y las pruebas unitarias para esta clase funciona bien:

@Entity
@Table{val name="educationinfo"}
class EducationInfo {
  @Id
  @GeneratedValue(){val strategy = GenerationType.AUTO}
  var id : Long = _

  @Column{val nullable = false, val length = 100}
  var name : String = "";

  @OneToOne{val fetch = FetchType.EAGER, val cascade = Array(CascadeType.PERSIST, CascadeType.REMOVE)}
  @JoinColumn{val name = "educationinfo_address_fk", val nullable = false}
  var location : Address = _

  @ManyToOne{val fetch = FetchType.LAZY, val cascade=Array(CascadeType.PERSIST)}
  @JoinColumn{val name = "educationinfo_user_fk", val nullable = false}
  var user : User = _

  @Column{val nullable = false, val length = 100}
  var degree : String = ""

  @Temporal(TemporalType.DATE)
  @Column{val nullable = true}
  var startyear : Date = new Date()
  var endyear : Date = new Date()

  @Column{val nullable = true, val length = 1000}
  var description : String = ""
}

También estoy ansioso por ver si hay alguna manera de saber cuál es el error que impide que el EntityManager de ser instanciado, pero el principal problema es qué puede estar causando un problema cuando agrego esta columna para usuario?

ACTUALIZACIÓN:

Se ha quitado una parte que estaba en error.

ACTUALIZACIÓN 2:

He cambiado la columna de usuario en la entidad de educación que se @ManyToOne y todas mis pruebas de unidad que ha fallado.

El final de mi registro de errores es la siguiente:

15035 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
15035 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
15047 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
[PersistenceUnit: jpaweb] Unable to build EntityManagerFactory
[PersistenceUnit: jpaweb] Unable to build EntityManagerFactory

A continuación EntityManager es nulo en todas las pruebas, por lo que falla.

ACTUALIZACIÓN 3:

La entidad Address no tiene claves ajenas a cualquier cosa, como se le llama de varias entidades.

Podría ser causado este problema mediante el uso de Apache Derby como base de datos?

Por desgracia no tengo ningún mensaje de error. Corro esto desde dentro de experto, y aunque puedo borrar la base de datos cada vez que no puedo decir lo que sucede que está mal. El @ManyToOne de EducationInfo -> El usuario no causa ningún problema, pero @OneToMany -.> EducationInfo de usuario hace

ACTUALIZACIÓN 4:

He añadido una mappedBy a la entidad de usuario como se sugiere. Tenía que en otra definición de columna, ya que tengo cinco definiciones que no funciona, y creo que son todas por la misma razón, por lo que estoy haciendo una prueba con uno. Por desgracia, todavía conduce a la EntiyManagerFactory no se construye por lo que todas las pruebas fallan.

ACTUALIZACIÓN FINAL:

El caso real era

  

no puede simultáneamente podido recuperar múltiple   bolsas

por lo que acaba de quitar la fetchType completamente de EducationInfo y el problema desapareció.

¿Fue útil?

Solución

mapeo complemento de OneToMany en el otro lado de asociación es ManyToOne, es puede no ser OneToOne. Eso es lo que está causando EntityManager falle.

Funciona cuando se quita la última línea de User porque entonces sólo se queda con OneToMany a Address y, aunque no se muestra aquí, presumiblemente Address no tiene un enlace a OneToOne User.

No soy un experto Scala; en Java que normalmente recibe un error y un seguimiento de pila impresa cuando EntityManager no puede inicializar; mensaje de error no siempre es muy descriptiva, pero por lo general dice lo mapeo tiene un problema. Tal vez usted necesita para modificar la configuración de registro si no se consigue ese error.

No entendía muy bien su modelo:

  

Básicamente, un usuario debería poder   tener varias direcciones, por lo que espero que   se convertirá en un ManyToMany, pero cada uso   también puede tener varias instancias de   información de la educación, por lo que la necesidad de   ManyToOne.

Eso suena como @OneToMany de User a Address a mí y (si el "uso" "usuario" significaba) como @OneToMany de User a EducationInfo.

  

En este momento el EducationInfo tiene una   OneToOne para el usuario, ya que cada fila se   ser único para una persona, pero quiero   ser capaz de cargar toda la educación   la información le da un nombre de usuario.

Esto entra en conflicto con arriba. Cualquiera puede tener varios EducationInfo por User o que es "único para una persona".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top