java - Hibernate 多对多映射的问题
问题描述
我有一个hibernate + oracle程序。在那,我通过“ApplicationIdentityProviders”表在“Applications”和“IdentityProviders”表之间建立了多对多的关系。运行程序时出现以下错误:
Exception in thread "main" java.lang.RuntimeException: org.hibernate.MappingException:
Could not determine type for: String, at table: identity_providers, for columns: [org.hibernate.mapping.Column(issuer)]
at com.oracle.hibernate.OCIAuthManager.setupTenant1Pdb1(OCIAuthManager.java:246)
at com.oracle.hibernate.OCIAuthManager.main(OCIAuthManager.java:283)
我无法弄清楚为什么。Applications.java 在这里。IdentityProviders.java 在这里。ApplicationIdentityProviders.java 在这里。主课在这里。Applications.hbm.xml 如下:
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Applications" table = "applications">
<meta attribute = "class-description">
This class contains the applications details.
</meta>
<id name = "application_id" type = "int" column = "application_id">
<generator class="native"/>
</id>
<set name = "application_id_providers" cascade="save-update" table="application_identity_providers">
<key column = "application_id"/>
<many-to-many column = "identity_provider_id" class="IdentityProviders"/>
</set>
<property name = "application_name" column = "application_name" type = "string"/>
<property name = "attr" column = "attr" type = "short"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
<class name = "IdentityProviders" table = "identity_providers">
<meta attribute = "class-description">
This class contains the identity providers' details.
</meta>
<id name = "identity_provider_id" type = "int" column = "identity_provider_id">
<generator class="native"/>
</id>
<property name = "attr" column = "attr" type = "short"/>
<property name = "protocols" column = "protocols" type = "short"/>
<property name = "issuer" column = "issuer" type = "String"/>
<property name = "cert1" column = "cert1" type = "String"/>
<property name = "cert2" column = "cert2" type = "String"/>
<property name = "is_tenant_default" column = "is_tenant_default" type = "short"/>
</class>
</hibernate-mapping>
hibernate-1.cfg.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:oracle:thin:@//localhost:1521/t1p1.oradev.oraclecorp.com</property>
<property name="connection.username">username</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="dialect">org.hibernate.dialect.Oracle12cDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<property name="current_session_context_class">thread</property>
<mapping resource = "Applications.hbm.xml"/>
</session-factory>
</hibernate-configuration>
我哪里错了?请帮忙。
更新 1:@Guillaume 的回答有效。但我现在收到以下错误:
Exception in thread "main" java.lang.RuntimeException:
org.hibernate.MappingException: An association from the table
application_identity_providers refers to an unmapped class:
IdentityProviders at
com.oracle.hibernate.OCIAuthManager.setupTenant1Pdb1(OCIAuthManager.java:246)
at com.oracle.hibernate.OCIAuthManager.main(OCIAuthManager.java:283)
更新 2:我解决了更新 1 中的错误。现在我收到以下错误:错误:ORA-01400:无法将 NULL 插入 ("SYS"."APPLICATION_IDENTITY_PROVIDERS"."APPLICATION_IDENTITY_PROVIDER_ID")
此错误发生在包含其他两个表的主键的中间表中,这些表具有多对多映射。在 ApplicationIdentityProviders.java 中,我有:
@Id
@SequenceGenerator(name="seq",sequenceName="oracle_seq",allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
private int application_identity_provider_id;
当我运行程序时,相关的输出片段是: Hibernate:
create table application_identity_providers (
application_identity_provider_id number(10,0) not null,
application_id number(10,0) not null,
identity_provider_id number(10,0) not null,
is_application_default number(5,0) not null,
primary key (application_id, identity_provider_id)
)
我哪里错了?
更新 3:给定“applications”表中的“application_name”,获取“identity_providers”和“saml_identity_providers”表中的全部内容。怎么做?
我尝试了以下方法:
Query query = entitymanager.createQuery("select a from Applications a join
fetch a.ApplicationIdentityProviders ap " +
"join fetch ap.IdentityProviders ip where a.application_name =
'newApplicationName'");
它给了我这个错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'applicationsRepository' defined in file
[D:\filepath\ApplicationsRepository.class]: Bean instantiation via
constructor failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to instantiate
[ApplicationsRepository]: Constructor threw exception; nested exception is
java.lang.IllegalArgumentException: org.hibernate.QueryException: could not
resolve property: ApplicationIdentityProviders of: Applications [select a
from com.package.entities.Applications a join fetch
a.ApplicationIdentityProviders ap join fetch
ap.IdentityProviders ip where a.application_name = 'newApplicationName']
解决方案
更快的方法是使用 Hibernate 工具自动生成映射文件。请参考以下文章。
如何在 Eclipse 中安装 Hibernate 工具?
http://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/
推荐阅读
- r - R 填补缺失的行
- c++ - 如何在 C++ 中用静态多态性代替动态多态性?
- javascript - 赛普拉斯从索引中删除网格
- autodesk-forge - Forge 是否从 IFC 文件转换 IfcGrid 元素
- twitter-bootstrap - Nuxt js 中的计算引导断点
- python - webargs 的字典 vs Marshmallow 数据类模式
- javascript - 如何在javascript中将列表转换为带有子项目的类别?
- python - 顺序调用时,Spark Data Frame 操作时间显着增长
- android - 在 pubspec.yaml 中使用 fluttertoast 时出现颤振构建问题
- scala - Flink(Scala):尝试在我的程序中使用窗口函数,但它报告类型不匹配