【问题标题】:Unknown mappedBy in: com.debatz.mistergift.model.User.token, referenced property unknown: com.debatz.mistergift.model.Token.user未知的 mappedBy 在:com.debatz.mistergift.model.User.token,引用的属性未知:com.debatz.mistergift.model.Token.user
【发布时间】:2016-05-17 13:43:57
【问题描述】:

当我将 war 部署到 Tomcat 8 时(使用 mvn tomcat:run-war 命令),我无法解决这个新异常。

这是粘贴的异常:

GRAVE:向 org.springframework.web.context.ContextLoaderListener 类的侦听器实例发送上下文初始化事件的异常 org.springframework.beans.factory.BeanCreationException:在类路径资源 [WEB-INF/data-context.xml] 中定义名称为“mg-em-default”的 bean 创建错误:调用 init 方法失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: misergift_pu] Unable to build Hibernate SessionFactory 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 原因:javax.persistence.PersistenceException: [PersistenceUnit: mistergift_pu] 无法构建 Hibernate SessionFactory 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1225) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access 600 美元(EntityManagerFactoryBuilderImpl.java:119) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:853) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843) 在 org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:397) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842) 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562) ... 21 更多

原因:org.hibernate.AnnotationException:未知 mappedBy in:com.debatz.mistergift.model.User.token,引用属性未知:com.debatz.mistergift.model.Token.user 在 org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:160) 在 org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1695) 在 org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1424) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) ... 29 更多

还有两个实体(没有 getter/setter):

@Entity
@Table(schema = "mistergift", name = "users")
public class User {

/**
 * The user id.
 */
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

/**
 * The user first name.
 */
@Column(name = "first_name", length = 255, nullable = false)
private String firstName;

/**
 * The user last name.
 */
@Column(name = "last_name", length = 255, nullable = false)
private String lastName;

/**
 * The user email.
 */
@Column(name = "email", length = 100, nullable = false)
private String email;

/**
 * The user password.
 */
@Column(name = "password", length = 255, nullable = false)
private String password;

/** The user role. */
@Column(name = "role", nullable = false)
@Enumerated(EnumType.ORDINAL)
private Role role;

/** The user token. */
@OneToOne(mappedBy = "user")
private Token token;

/**
 *
 */
public User() {
    this.groups = new ArrayList<Group>();
}

// ...

还有……

@Entity
@Table(schema = "mistergift", name = "user_token")
public class Token {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "value", length = 75, nullable = false)
private String value;

@Column(name = "expiration_date", nullable = false)
@Temporal(TemporalType.DATE)
private Date expirationDate;

@OneToOne(mappedBy = "token")
private User user;

/**
 *
 */
public Token() { }

// ...

你能给我一些建议来解决这个问题吗?

谢谢。

【问题讨论】:

    标签: java spring hibernate maven tomcat


    【解决方案1】:

    您不能在关联的两边都使用mappedBy

    不正确

    /** The user token. */
    @OneToOne(mappedBy = "user")
    private Token token; 
    
    @OneToOne(mappedBy = "token")
    private User user;
    

    首先,您应该决定哪个持久化将是关联的所有者(哪个表将具有外键)。 例如,如果User 将有一个外键列fk_tokenToken 标识符

    @Entity
    @Table(schema = "mistergift", name = "users")
    public class User {
    
        /** The user token. */
        @OneToOne
        @JoinColumn(name = "fk_token")
        private Token token;
    
    }
    
    @Entity
    @Table(schema = "mistergift", name = "user_token")
    public class Token {
    
        @OneToOne(mappedBy = "token", fetch = FetchType.LAZY)
        private User user;
    
    }
    

    如果Token 将有一个外键列fk_userUser 标识符

    @Entity
    @Table(schema = "mistergift", name = "users")
    public class User {
    
        /** The user token. */
        @OneToOne(mappedBy = "user")
        private Token token;
    
    }
    
    @Entity
    @Table(schema = "mistergift", name = "user_token")
    public class Token {
    
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "fk_user")
        private User user;
    
    }
    

    更新

    由于otherSideProperty == null,在OneToOneSecondPass.doSecondPass(Map) 行出现异常。 Hibernate 尝试在他知道的持久类中查找 Token.user 属性并失败。所以 Hibernate 不认为 Token 是持久的。原因可能是

    1. Token 没有@Entity 注释。

    2. Token 未映射到hibernate.cfg.xml

    3. 不正确扫描具有持久性的包,如@magik reported

    Hibernate 显然有一个非常不清楚,并且可能是不正确的错误消息。

    【讨论】:

    • 嗨 v.ladynev。感谢您的快速回复。我进行了更改,但不幸的是我得到了同样的错误。对此还有什么想法吗?
    • @magik 你使用哪个版本的 Hibernate?
    • v.ladynev 我正在使用 hibernate-entitymanager、hibernate-core 通过 maven 版本 4.3.5.Final 和 spring-data-jpa 版本 1.9.2.RELEASE
    • 奇怪的是,Intellij 似乎无法识别该关系,因为当我开始输入连接列名称时没有自动完成功能...(我决定使用用户作为所有者)。跨度>
    【解决方案2】:

    所以我将此主题标记为已解决。我终于找到了如何进行。 v.ladynev 的回答是正确的,但我还有另一个错误隐藏了真正的问题。这是我的组件扫描注释,它被重定向到一个不存在的包(我已重命名我的实体包)。谢谢大家!

    【讨论】:

    • 感谢您接受答复。我已经更新了它。我昨天打算更新它,考虑到类似的情况,但决定在睡觉后进行。也许,你自己找到答案是件好事。 :)
    • 多亏了你,我找到了答案。我认为这是命名的问题!
    【解决方案3】:

    尝试如下更改您的代码,它无法找到“com.debatz.mistergift.model.Token.user”,因为它区分大小写。

    @OneToOne(mappedBy = "User")
    

    @OneToOne(mappedBy = "Token")
    

    我建议使用 hibernate 插件来生成这些 dao 类,当然你可以自定义它们。但是你可以避免一些错字并节省时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 2016-02-05
      • 2011-08-15
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多