我正在开发一个应用程序,其中所有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.java
和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;
....
}
我对hibernate仍然不是很舒服,所以我想知道我是否应该将UserProfile
中的UserAccountImpl
引用更改为UserProfileImpl
。然后再次发生同样的情况UserProfileImpl
引用userAccount
,因为它是双向导航内容。
什么是不破坏结构一致性的最佳选择?
感谢您阅读本文
答案 0 :(得分:3)
您有以下选择:
你必须告诉Hibernate以哪种类用于接口UserAccount
。目前,最简单的解决方案是使用具体类型而不是UserProfileImpl
中的界面。
您可以使用@Target
指定要使用的实现(请参阅[文档] [1])。
您可以使用自定义UserType
映射字段。这允许在运行时选择映射(用于接口的实现),但是您必须编写代码以自己复制业务对象和DB之间的字段(不再自动映射)。
答案 1 :(得分:2)
您可以尝试以下方法:
@OneToOne(mappedBy="profile", targetEntity=UserAccountImpl.class)
private UserAccount userAccount
答案 2 :(得分:0)
UserProfile必须是一个单独的实体吗?您可以将其建模为Component,并将UserAccount和UserProfile表合并为一个。您的对象模型仍然具有单独的UserProfile对象,它只是UserAccount拥有的值对象。
并非每个对象都必须作为实体实现,并且在实践中一对一的映射非常罕见....