mysql - 为什么需要从实体到同一实体的关系表

标签 mysql hibernate relation

我有一个像这样的 roo-script-line:

字段集--类成员--字段名称邀请者--类型成员--基数ONE_TO_MANY

Hibernate 需要一个名为member_invitedby 的表,其中包含列member 和invitedby:

PersistenceException: [PersistenceUnit: megaadmin] Unable to build EntityManagerFactory
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1486)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1117)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:922)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: megaadmin] Unable to build EntityManagerFactory
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915)
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890)
        at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:286)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
        ... 22 more
Caused by: org.hibernate.HibernateException: Missing table: member_invitedby
        at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1272)
        at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:506)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1750)
        at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
        ... 28 more

如果我手动创建一个包含member和invitedby列的表member_invitedby,则此异常就会消失。

我不知道为什么hibernate需要一个n-m表,因为一个成员只能被一个成员邀请,它是1-n!

问候。

最佳答案

映射 OneToMany 单向关联的默认方法是使用连接表。这可以避免连接列污染子(多)端,因为它不应该知道其父(一侧)。

如果您想要在多方使用外键,引用一侧,那么您需要在 OneToMany 关联声明上使用 @JoinColumn 注释来明确说明。我不知道如何与Roo做到这一点。

关于mysql - 为什么需要从实体到同一实体的关系表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15056601/

相关文章:

java - 如何在 JPA Repository 接口(interface)中编写不同的 SQL 子句

ruby-on-rails - Rails 模型范围内的关联数据

ruby-on-rails - 将两个 ActiveRecord::Relation 与 OR 组合,而不是 AND,返回一个 Relation 而不是一个 Array 以便以后能够分页

mysql - 在 POINT(lat, long) 上提高 MySQL 性能的方法

java - 状态模式 : States as Hibernate singleton entities

mysql - 玛丽亚数据库。使用事务回滚而不锁定表

hibernate - Hibernate 二级缓存的解决方案

php - 拉维尔 |在 2 个表中搜索

python - 将字典的字典展平为 python 中的列表

MySQL 子查询死锁(某种)