java - JPQL(Hibernate 实现)选择与连接问题

标签 java hibernate war jpql

我在使用 JPQL(使用 Hibernate)时遇到了一些困难。

我有 2 个实体:

package org.oscarehr.common.model;

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.OneToMany;
import javax.persistence.PrePersist;
import javax.persistence.JoinColumn;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
@Table(name="spireAccessionNumberMap")
public class SpireAccessionNumberMap extends AbstractModel<Integer> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name="uaccn")
    private Integer uaccn;

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="uaccn_id", referencedColumnName="id")
    private List<SpireCommonAccessionNumber> commonAccessionNumbers = new ArrayList<SpireCommonAccessionNumber>();

    public SpireAccessionNumberMap() {
    }

    public SpireAccessionNumberMap(Integer uniqueAccn) {
        this.uaccn = uniqueAccn;
    }


    //@Override
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }   

    public Integer getUniqueAccessionNumber() {
        return uaccn;
    }

    public void setUniqueAccessionNumber(Integer uaccn) {
        this.uaccn = uaccn;
    }

    public List<SpireCommonAccessionNumber> getCommonAccessionNumbers() {
        return commonAccessionNumbers;
    }

    @PrePersist
    public void prePersist() {
        Iterator<SpireCommonAccessionNumber> i = this.commonAccessionNumbers.iterator();
        SpireCommonAccessionNumber commonAccessionNumber;
        while(i.hasNext()) {
            commonAccessionNumber = i.next();
            commonAccessionNumber.setUniqueAccessionId(this.uaccn);         
        }
    }

}

package org.oscarehr.common.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
@Table(name="spireCommonAccessionNumber")
public class SpireCommonAccessionNumber extends AbstractModel<Integer> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name="caccn")
    private String caccn;
    @ManyToOne
    @JoinColumn(name="uaccn_id", referencedColumnName="id")
    private Integer uaccn_id;




    //@Override
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }   

    public String getCommonAccessionNumber() {
        return caccn;
    }

    public void setCommonAccessionNumber(String caccn) {
        this.caccn = caccn;
    }


    public Integer getUniqueAccessionId() {
        return uaccn_id;
    }

    public void setUniqueAccessionId(Integer uaccn_id) {
        this.uaccn_id = uaccn_id;
    }
}

基本上,我有“ map ”对象,它有一个与之关联的唯一编号。 map 对象有一个指向 1 个或多个“commonNumber”对象的“链接”,这些对象存储一个“common”号码。

这个想法是能够使用 JPQL 和 'Dao' 将大量常见数字映射到唯一数字。

但是,当我部署 java WAR 文件时,出现此错误:

2013-01-04 13:42:12,344 INFO  [Version:14] Hibernate Commons Annotations 3.1.0.GA
2013-01-04 13:42:12,347 INFO  [Version:16] Hibernate EntityManager 3.4.0.GA
2013-01-04 13:42:17,753 ERROR [ContextLoader:215] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring_jpa.xml]: Invocati
on of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on org.oscarehr.common.model.SpireCommonAccessionNumber.uaccn_
id references an unknown entity: java.lang.Integer
        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.oscarehr.common.web.OscarSpringContextLoader.createWebApplicationContext(OscarSpringContextLoader.java:97)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943)
        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:504)
        at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1385)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:306)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
        at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1389)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1653)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1662)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1642)
        at java.lang.Thread.run(Thread.java:679)
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on org.oscarehr.common.model.SpireCommonAccessionNumber.uaccn_id references an unknown entity: java.lang.Integer
        at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:81)
        at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:456)
        at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:438)
        at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:309)
        at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1148)
        at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1226)
        at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:173)
        at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:854)
        at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:425)
        at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:131)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:257)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
        ... 28 more

我在这里有点不知所措......我尝试摆弄不同的方法将“公共(public)”对象映射到“ map ”对象,但我不断收到错误。

有人可以帮我解释一下吗?

最佳答案

@ManyToOne 的映射似乎应该如此。

@ManyToOne()
@JoinColumn(name="uaccn_id")
private SpireAccessionNumberMap spireAccessionNumberMap;


public SpireAccessionNumberMap getSpireAccessionNumberMap() {
    return spireAccessionNumberMap;
}

public void setSpireAccessionNumberMap(
        SpireAccessionNumberMap spireAccessionNumberMap) {
    this.spireAccessionNumberMap = spireAccessionNumberMap;
}

OneToMany 端需要以下映射。

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER,mappedBy="spireAccessionNumberMap")
private List<SpireCommonAccessionNumber> commonAccessionNumbers = new ArrayList<SpireCommonAccessionNumber>();

关于java - JPQL(Hibernate 实现)选择与连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163192/

相关文章:

java - 如何为Postman的binary类型的请求体构建RestTemplate?

java - @ServerEndpoint 和 Spring MVC 注入(inject)

java - 在具有 hibernate 功能的模型(域)类中使用枚举 - 无法解析属性 - 异常

java.lang.IllegalArgumentException : URI is not hierarchical (in deployed application) 异常

war - Emma 检测 WAR 文件

java - 如何在基于类的注释中声明 Spring 中的 Transaction bean?

java - 使用 GSON 将 JSON 转换为 Java 对象时如何覆盖 Java 映射?

hibernate - 在 Hibernate 中使用注释的dynamicUpdate=true 不起作用

java - 使用 Spring 和 Hibernate 将异常记录到数据库

java - 构建单个 Spring Boot WAR 项目以进行部署