2009-11-09 16 views
7

Estoy desarrollando una aplicación donde todos los pojos están expuestos como interfaz, pero mapeamos la clase de implementación real. Estamos usando la anotación de primavera y JPA. Estoy a punto para probar la relación uno-a-uno y estoy teniendo un ligero problema con la interfaz.Hibernate Mapeo uno a uno con interfaz. Necesito consejo

causada por: org.springframework.beans.factory.BeanCreationException: Error al crear el frijol con el nombre 'sessionContainer' se define en la ruta de clase de recursos [META-INF/modelo-config.xml]:
No se puede resolver la referencia a bean 'sessionFactory' mientras configura el argumento constructor; excepción anidada es org.springframework.beans.factory.BeanCreationException: Error al crear bean con el nombre 'sessionFactory' definido en el recurso de vía de acceso de clase [META-INF/model-config.xml]:
Falló la invocación del método init; la excepción anidada es org.hibernate.AnnotationException:
@OneToOne o @ManyToOne en com.mycompany.project.subproject.model.UserAccountImpl.profile hace referencia a una entidad desconocida: com.mycompany.project.

así que antes de esta clase toda la otra clase asignada funcionan como se espera por lo que sólo a publicar parte del archivo applicationContext que nombré model-config.xml

<property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
     </props> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
      ... 
      <value>com.mycompany.project.subproject.model.UserProfileImpl</value> 
      <value>com.mycompany.project.subproject.model.UserAccountImpl</value> 
      ... 
     </list> 
    </property> 

aquí son los dos implicados clase UserProfileImpl.java y UserAccountImpl.java

//UserAccountImpl Class 
@Entity 
@Table(name ="USER_ACCOUNT") 
public class UserAccountImpl implements UserAccount { 

    @Id @GeneratedValue 
    @Column(name="USER_ACCOUNT_ID") 
    private Long ID; 

    ... 

    @OneToOne 
    @JoinColumn(name="USER_PROFILE_ID") 
    private UserProfile profile; 

    ... 
} 

//UserProfileImpl class 
@Entity 
@Table(name="USER_PROFILE") 
public class UserProfileImpl implements UserProfile { 

@Id @GeneratedValue 
@Column(name="USER_PROFILE_ID") 
private Long ID; 
.... 

@OneToOne(mappedBy="profile") 
private UserAccount userAccount; 
.... 

}

todavía no estoy muy cómodo con la hibernación, así que me pregunto si debería cambiar la referencia UserProfile en UserAccountImpl a UserProfileImpl. Entonces, nuevamente, puede ocurrir lo mismo en la referencia UserProfileImpl para userAccount, ya que es una navegación bidireccional. ¿Cuál es la mejor opción que no romperá la consistencia de la estructura? Gracias por leer este

+0

Podría explicar por qué está utilizando las interfaces de POJOs? – dlinsin

+0

Hibernate no puede saber qué clase necesita que implemente 'UserAccount', por lo tanto, debe usar' targetEntity' como @david, ya que Hibernate no puede inferir esto. –

Respuesta

2

puede probar con el siguiente:

@OneToOne(mappedBy="profile", targetEntity=UserAccountImpl.class) 
private UserAccount userAccount 
+0

gracias bruv este es el más fácil.probaré –

3

tiene las siguientes opciones:

  1. usted debe decirle a Hibernate, que de alguna manera clase que se utiliza para la interfaz UserAccount. Actualmente, la solución más simple es usar un tipo concreto en lugar de la interfaz en su UserProfileImpl.

  2. Puede usar @Target para especificar la implementación que se va a utilizar (consulte [los documentos] [1]).

  3. Puede asignar el campo con un UserType personalizado. Esto permite elegir el mapeo (qué implementación utilizar para una interfaz) en tiempo de ejecución, pero debe escribir el código para copiar los campos entre sus objetos comerciales y el DB usted mismo (ya no se realiza mapeo automático).

+0

gracias por la comprensión. volverá a usted.gracias mucho –

+0

este funciona para mí, gracias de nuevo –

0

¿El PerfilUsuario tiene que ser una entidad separada? Puede modelar esto como un Componente, y combinar las tablas UserAccount y UserProfile en una sola. Su modelo de objeto aún tendría un objeto de perfil de usuario separado, sería simplemente un objeto de valor propiedad de la cuenta de usuario.

No todos los objetos tiene que ser implementado como una entidad, y uno-a-uno asignaciones son bastante raros en la práctica ....

+0

mmmh suena muy adecuado aquí.Pero no estoy realmente bien (quiero decir que voy a tiene que leer) con componente. Así que lo veré en el próximo hito. Pero definitivamente tu solución es genial para mí. Gracias. –

Cuestiones relacionadas