Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Hibernate双向一域,具有可连接类和多态类,每个具体类具有表_Mysql_Hibernate - Fatal编程技术网

Mysql Hibernate双向一域,具有可连接类和多态类,每个具体类具有表

Mysql Hibernate双向一域,具有可连接类和多态类,每个具体类具有表,mysql,hibernate,Mysql,Hibernate,我正在使用Hibernate4.1.7Java和Spring,使用MySql 我有一个Publication类,它是抽象的,有3个子类,还有一个Page类,它也是抽象的,有2个子类 在Publication中有一个列表,在Page中我有一个Publication,因此这是一个常见的OneToMany/ManyToOne双向关系,但由于我需要对页面进行排序,所以我使用交叉表,如图所示: // Publication.java @OneToMany(fetch=FetchType.LAZY) @Jo

我正在使用Hibernate4.1.7Java和Spring,使用MySql

我有一个Publication类,它是抽象的,有3个子类,还有一个Page类,它也是抽象的,有2个子类

在Publication中有一个列表,在Page中我有一个Publication,因此这是一个常见的OneToMany/ManyToOne双向关系,但由于我需要对页面进行排序,所以我使用交叉表,如图所示:

// Publication.java
@OneToMany(fetch=FetchType.LAZY)
@JoinTable(name="publication_pages",
            joinColumns=@JoinColumn(table="publication_pages", name="pub_id", referencedColumnName="id"),
            inverseJoinColumns=@JoinColumn(table="publication_pages", name="pg_id", referencedColumnName="id"))
@OrderColumn(name="i")
public List<Page> getPages() {
    return pages;
}

// Page.java

@ManyToOne
@JoinTable(name="publication_pages",
        joinColumns=@JoinColumn(table="publication_pages", name="pg_id", referencedColumnName="id", insertable=false, updatable=false),
        inverseJoinColumns=@JoinColumn(table="publication_pages", name="pub_id", referencedColumnName="id", insertable=false, updatable=false))
public Publication getPublication() {
    return publication;
}
一个I做错了什么,或者是一个Hibernate错误,或者是因为它在查询中执行了大量的联合而根本不可能实现

短暂性脑缺血发作

编辑:这是hibernate正在生成的查询(我删除了所有不相关的列):

如您所见,它在联接中使用page1_uu.pub_id(就好像pub_id在第页上一样),而不是pages0_u.pub_id(在where子句中正确使用)


调用Publication.getPages().isEmpty()

可能会发生这种情况,您可以向
@OneToMany
添加一个
mappedBy
,并删除它的
@JoingTable
。与OneToMany/ManyToOne的双向关系不需要两边都有
@JoingTable
,您只需要在关系所有者上使用它。

为什么要使用交叉表进行排序?您是否考虑过在Page类中实现可比较的接口,并使用
@Sort(type=SortType.NATURAL)
注释出版物中的页面列表?因为我需要getPages()集合是有序的(一个页面将是出版物的第一页,另一个页面将是第二页,依此类推),DDL采用交叉表设计。但我认为,如果我们能够保持“排序列表”的行为,我可以同意其他人的观点,即摆脱交叉表。Compariable似乎不是一个选项,因为它需要一个必须在代码中“手动”处理的Page.getPageNumber,而不是依赖列表。我已经用hibernate 4.1.7测试了您的代码,并且调用publication.getPages()没有导致错误-奇怪。Hibernate生成了以下查询:
Select pages0.pub_id为pub1_8_2_,pages0_.pg_id为pg2_6_2_,pages0_.i为i2_,page1_.id为id5_0_,page1_.pub_id为pub1_6_0_,publicatio2.id作为id8.u 1来自publication pages pages0内部连接页page1上Page0.pg\u id=page1\u.id离开外部连接出版物page1上page1\u 1\u.id=page1\u 1\u.pg\u id离开外部连接出版物publicatio2上page1\u 1.pub\u id=publicatio2\u.id其中pages0.pub\u id=?
@FelixEbert非常感谢您花时间尝试。然而,Page和Publication是两个具有子类的抽象类吗?我没有“页面”表,只有具体的子类表,这就是Hibernate生成联合的原因,在这些联合中,它搜索联合中的page1.pub\u id,而不是限于pages0.pub\u id。我清理了(删除了许多对理解问题没有用的字段)并将它生成的查询发布在这里,问题在于连接中的page1_uu.pub_id而不是pages0_u.pub_id。
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'page1_.pub_id' in 'field list'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2318)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at $Proxy54.executeQuery(Unknown Source)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1897)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1698)
at org.hibernate.loader.Loader.doQuery(Loader.java:832)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:263)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2094)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:61)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:678)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:82)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1801)
at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:524)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:212)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:520)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:125)
at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:152)
at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:139)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:212)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:138)
at org.hibernate.collection.internal.PersistentList.isEmpty(PersistentList.java:121)
Hibernate: 
select 
pages0_.pub_id as pub1_46_3_, 
pages0_.pg_id as pg2_43_3_, 
pages0_.i as i3_,
page1_.id as id42_0_, 
[...] 
page1_.pub_id as pub1_43_0_ [...]

from publication_pages pages0_ 
inner join ( 
  select id, [...] from page_fixed union select id, [...] from page_query 
) page1_

on pages0_.pg_id=page1_.id left outer join ( 
  select id, [...] from publication 
) publicatio2_ 
on page1_.pub_id=publicatio2_.id left where pages0_.pub_id=?