java - hibernate referencedColumnNames 未映射到单个属性

标签 java spring hibernate

我在使用 Hibernate 4 的 Spring 3 Web 应用程序中遇到以下异常:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in URL [file:war/WEB-INF/datasource-config.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: referencedColumnNames(DISCUSSION_ID) of com.jr.freedom.discusion.Message.discussion referencing com.jr.freedom.discusion.Discussion not mapped to a single property
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:96)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:44)
    at org.springframework.test.context.TestContext.buildApplicationContext(TestContext.java:198)
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:233)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:126)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:85)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:231)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:95)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:139)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.AnnotationException: referencedColumnNames(DISCUSSION_ID) of com.jr.freedom.discusion.Message.discussion referencing com.jr.freedom.discusion.Discussion not mapped to a single property
    at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:205)
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:116)
    at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1514)
    at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1437)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1355)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    ... 29 more

下面是使用discission Pojo的Message POJO:

@Entity
@Table(name = "MESSAGE")
public class Message {

    @Id
    @Column(name = "message_id")
    private String id;

    @Column(name = "message_text", nullable = false)
    private String messageText;

    /**
     * Foreign key for user table
     */
    @Id
    @OneToOne
    @JoinColumn(name = "from_user", nullable = false)
    private User fromUser;

    /**
     * Foreign key for discussion table
     */
    @Id
    @ManyToOne
    @JoinColumn(name = "discussion",referencedColumnName="DISCUSSION_ID", nullable = false)
    private Discussion discussion;

    public Message() {
        id = UUID.randomUUID().toString();
    }

    public String getMessageText() {
        return messageText;
    }

    public void setMessageText(String messageText) {
        this.messageText = messageText;
    }

    public User getFromUser() {
        return fromUser;
    }

    public void setFromUser(User fromUser) {
        this.fromUser = fromUser;
    }

    public Discussion getDiscussionId() {
        return discussion;
    }

    public void setDiscussionId(Discussion discussion) {
        this.discussion = discussion;
    }

    public String getId() {
        return id;
    }

}

这里是讨论 POJO:

@Entity
@Table(name = "DISCUSSION")
public class Discussion {

    @Id
    @Column(name = "DISCUSSION_ID")
    private String id;

        @Column(name = "TITLE", nullable = false)
    private String title;

    @Column(name = "CATAGORY", nullable = false)
    private String catagory;

    @Id
    @OneToOne
    @JoinColumn(name = "discussionOwner", nullable = false)
    private User discussionOwner;

    public Discussion() {
        id = UUID.randomUUID().toString();
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCatagory() {
        return catagory;
    }

    public void setCatagory(String catagory) {
        this.catagory = catagory;
    }

    public User getDiscussionOwner() {
        return discussionOwner;
    }

    public void setDiscussionOwner(User discussionOwner) {
        this.discussionOwner = discussionOwner;
    }

    public String getId() {
        return id;
    }

}

我错过了什么?这两个实体的关系是一个讨论实体可以包含许多消息,而一个消息只能属于一个讨论

提前致谢

最佳答案

对于那些对执行复合键连接感兴趣的人,请尝试:

@JoinColumns({    
  @JoinColumn(name = "x", referencedColumnName = "x"),
  @JoinColumn(name = "y", referencedColumnName = "y"),
  @JoinColumn(name = "z", referencedColumnName = "z")
})

本质上,如果您有 3 列标记为 @ID,JPA 假定您需要所有 3 列作为唯一标识。这意味着在外键方面,您还需要 3 列来进行正确的外键引用。

关于java - hibernate referencedColumnNames 未映射到单个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11206000/

相关文章:

java - 如何在java maven项目的基础级别上读取文本文件

java - 使用 HANA 的 Web 应用程序,获取 SLF4J : Class path contains multiple SLF4J bindings

hibernate - 测试grails属性是否为惰性/未初始化?

hibernate - ColdFusion ORMmappedSuperClass.hbmxml 有太多字段

java.lang.NoClassDefFoundError : [generic] at dalvik. system.NativeStart.main(本地方法)

java - 包和类之间的名称冲突。 Eclipse 或 javac 中的错误?

java - 如何创建一个循环来计算一个特定数字可以安装在另一个特定数字中的次数?

java - 属性文件中的中文字符未正确解码

java - 使用 url 模式过滤映射 servlet **

java - Maven:在打包期间执行antrun任务