简体   繁体   English

通过引用带有注释的未知目标实体属性

[英]mappedBy reference an unknown target entity property with annotation

I try to store an Observable and its observers into a database. 我尝试将一个Observable及其观察者存储到数据库中。 I receive during execution 我在执行期间收到

org.hibernate.AnnotationException: mappedBy reference an unknown target entity property org.hibernate.AnnotationException:mappedBy通过引用未知目标实体属性

Of course I used google and found some good answer. 当然我用谷歌,找到了一些很好的答案。

So I added to the annotation mappedBy, targetEntity, fetch and cascade. 因此,我在注释中添加了mappingBy,targetEntity,fetch和cascade。

But I still got the same error. 但是我仍然遇到同样的错误。 I tried so far actually everything I could find with google with no success. 到目前为止,我尝试使用Google可以找到的所有内容实际上都没有成功。 It is probably only a minor think and I hope you can help me. 这可能只是个小问题,希望您能帮助我。 (I use Spring Boot) (我使用Spring Boot)

ObservableImpl ObservableImpl

@Entity
public class ObservableImpl extends Observable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    @OneToMany(mappedBy = "oservableImpl", targetEntity = ObserverImpl.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    List<ObserverImpl> observerList = new LinkedList<>();


    public ObservableImpl(String name) {
        this.name = name;
    }

    protected ObservableImpl() {
    }

    @Override
    public synchronized void addObserver(Observer o) {
        super.addObserver(o);
        observerList.add((ObserverImpl) o);
    }

    @Override
    public synchronized void deleteObserver(Observer o) {
        super.deleteObserver(o);
        observerList.remove(o);
    }

    public void change() {
        setChanged();
        notifyObservers();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ObservableImpl that = (ObservableImpl) o;

        return id == that.id;
    }

    @Override
    public String toString() {
        return "ObservableImpl{" +
                "ID=" + id +
                '}';
    }
}

ObserverImpl 观察者

@Entity
public class ObserverImpl implements Observer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long ID;
    private String name;

    public Long getID() {
        return ID;
    }

    public void setID(Long ID) {
        this.ID = ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ObserverImpl(String name) {
        this.name = name;
    }

    protected ObserverImpl() {
    }


    @Override
    public String toString() {
        return "ObserverImpl{" +
                "ID=" + ID +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ObserverImpl observer = (ObserverImpl) o;

        return ID == observer.ID;
    }


    @Override
    public void update(Observable o, Object arg) {
        System.out.println(this);
    }
}

Error Message: 错误信息:

2017-06-11 14:40:57.032  INFO 21156 --- [           main] c.e.hibernate.HibernateApplication       : No active profile set, falling back to default profiles: default
2017-06-11 14:40:57.061  INFO 21156 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4516af24: startup date [Sun Jun 11 14:40:57 CEST 2017]; root of context hierarchy
2017-06-11 14:40:57.826  INFO 21156 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$cfcf04d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-06-11 14:40:58.032  INFO 21156 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2017-06-11 14:40:58.039  INFO 21156 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2017-06-11 14:40:58.039  INFO 21156 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.14
2017-06-11 14:40:58.091  INFO 21156 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2017-06-11 14:40:58.091  INFO 21156 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1031 ms
2017-06-11 14:40:58.163  INFO 21156 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-06-11 14:40:58.165  INFO 21156 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-06-11 14:40:58.166  INFO 21156 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-06-11 14:40:58.166  INFO 21156 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-06-11 14:40:58.166  INFO 21156 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-06-11 14:40:58.387  INFO 21156 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2017-06-11 14:40:58.394  INFO 21156 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
2017-06-11 14:40:58.428  INFO 21156 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.0.12.Final}
2017-06-11 14:40:58.428  INFO 21156 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2017-06-11 14:40:58.429  INFO 21156 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2017-06-11 14:40:58.449  INFO 21156 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2017-06-11 14:40:58.501  INFO 21156 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2017-06-11 14:40:58.596  WARN 21156 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.example.hibernate.obs.ObserverImpl.oservableImpl in com.example.hibernate.obs.ObservableImpl.observerList
2017-06-11 14:40:58.598  INFO 21156 --- [           main] o.apache.catalina.core.StandardService   : Stopping service Tomcat
2017-06-11 14:40:58.606  INFO 21156 --- [           main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-06-11 14:40:58.612 ERROR 21156 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.example.hibernate.obs.ObserverImpl.oservableImpl in com.example.hibernate.obs.ObservableImpl.observerList
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at com.example.hibernate.HibernateApplication.main(HibernateApplication.java:19) [classes/:na]
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.example.hibernate.obs.ObserverImpl.oservableImpl in com.example.hibernate.obs.ObservableImpl.observerList
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:769) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:719) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1655) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    ... 16 common frames omitted


Process finished with exit code 1

Thank you a lot. 非常感谢。

HibernateApplication Hibernate应用

@SpringBootApplication
public class HibernateApplication {


    private static final Logger log = LoggerFactory.getLogger(HibernateApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(HibernateApplication.class);
    }


    @Bean
    public CommandLineRunner addObservables(ObserveableRepository repository) {
        return (args) -> {
            useObserver(repository);

            // fetch all customers
            log.info("Observables found with findAll():");
            log.info("-------------------------------");
            for (ObservableImpl observable : repository.findAll()) {
                log.info(observable.toString());
                observable.change();
            }
            log.info("");

        };
    }

    private void useObserver(ObserveableRepository repository) {
        ObservableImpl observable = new ObservableImpl("1");
        observable.addObserver(new ObserverImpl("firstObserver"));
        observable.addObserver(new ObserverImpl("secondObserver"));
        observable.addObserver(new ObserverImpl("thirdObserver"));
        repository.save(observable);
    }
}

ObserveableRepository 可观察的存储库

public interface ObserveableRepository extends CrudRepository<ObservableImpl, Long> {

}

application.properties application.properties

spring.datasource.url=jdbc:h2:file:~/test3;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE
spring.datasource.username=admin
spring.datasource.password=password
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

I recommend you to rename your entities and give them "simple" and comprehended names. 我建议您重命名您的实体,并为其赋予“简单”的名称。 This will allow you not take care about the complex definitions of their fields and possible errors. 这将使您不必担心它们的字段的复杂定义和可能的错误。

For example: 例如:

@Entity
public class Experiment extends Observable {
    //...

    @OneToMany(mappedBy = "experiment")
    private Set<Experimenter> experimenters = new HashSet<>();

    //...
} 

@Entity
public class Experimenter extends Observer {
    //...

    @ManyToOne
    private Experiment experiment;

    //...
} 

So we had here a classic bidirectional OneToMany association 所以我们在这里有了一个经典的双向 OneToMany关联


To get access to H2 database from IDE you can use this answer. 要从IDE访问H2数据库,可以使用答案。

Add an ObservableImpl field to the child entity ObserverImpl as indicated by the error message 如错误消息所示,将ObservableImpl字段添加到子实体ObserverImpl

@ManyToOne
@JoinColumn(name = "OBSERVABLE_ID")
private ObservableImpl observableImpl;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM