使用interface.i进行Hibernate一对一映射需要建议

时间:2009-11-09 12:25:01

标签: java hibernate spring java-ee interface

我正在开发一个应用程序,其中所有pojos都作为接口公开,但我们映射真实的实现类。我们正在使用spring和JPA annotation.i'm即将测试一对一的关系,我是接口有轻微问题。

  

引起:org.springframework.beans.factory.BeanCreationException:创建类路径资源[META-INF / model-config.xml]中定义的名为'sessionContainer'的bean时出错:
  设置构造函数参数时无法解析对bean'sessionFactory'的引用;嵌套异常是org.springframework.beans.factory.BeanCreationException:
   在类路径资源[META-INF / model-config.xml]中定义名为'sessionFactory'的bean时出错:
  调用init方法失败;嵌套异常是org.hibernate.AnnotationException:
  com.mycompany.project.subproject.model.UserAccountImpl.profile上的@OneToOne或@ManyToOne引用了一个未知实体:com.mycompany.project。

所以在这个类之前所有其他映射类都按预期工作,所以我只发布我命名为applicationContext

的部分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>

这里有两个涉及的课程UserProfileImpl.javaUserAccountImpl.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;
  ....
}

我对hibernate仍然不是很舒服,所以我想知道我是否应该将UserProfile中的UserAccountImpl引用更改为UserProfileImpl。然后再次发生同样的情况UserProfileImpl引用userAccount,因为它是双向导航内容。 什么是不破坏结构一致性的最佳选择? 感谢您阅读本文

3 个答案:

答案 0 :(得分:3)

您有以下选择:

  1. 你必须告诉Hibernate以哪种类用于接口UserAccount。目前,最简单的解决方案是使用具体类型而不是UserProfileImpl中的界面。

  2. 您可以使用@Target指定要使用的实现(请参阅[文档] [1])。

  3. 您可以使用自定义UserType映射字段。这允许在运行时选择映射(用于接口的实现),但是您必须编写代码以自己复制业务对象和DB之间的字段(不再自动映射)。

答案 1 :(得分:2)

您可以尝试以下方法:

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

答案 2 :(得分:0)

UserProfile必须是一个单独的实体吗?您可以将其建模为Component,并将UserAccount和UserProfile表合并为一个。您的对象模型仍然具有单独的UserProfile对象,它只是UserAccount拥有的值对象。

并非每个对象都必须作为实体实现,并且在实践中一对一的映射非常罕见....