【发布时间】:2019-05-17 05:49:19
【问题描述】:
我的 java 模型包含 3 个主键,TokensPK 类显示我的主键。
hbm.xml 文件,标签composite-id 显示这些 PK 并显示 2 类之间的关系,但我无法理解
public class UserTokens {
private String userId;
private String loginProvider;
private String name;
private String value;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getLoginProvider() {
return loginProvider;
}
public void setLoginProvider(String loginProvider) {
this.loginProvider = loginProvider;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
和
public class TokensPK implements Serializable {
private String userId;
private String loginProvider;
private String name;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getLoginProvider() {
return loginProvider;
}
public void setLoginProvider(String loginProvider) {
this.loginProvider = loginProvider;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是我的 hbm.xml 文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="oauth.identity.IdentityModel.UserTokens" table="UserTokens" schema="dbo" catalog="BBB">
<composite-id mapped="true" class="oauth.identity.IdentityModel.TokensPK">
<key-property name="userId">
<column name="UserId" sql-type="nvarchar(450)" length="450"/>
</key-property>
<key-property name="loginProvider">
<column name="LoginProvider" sql-type="nvarchar(450)" length="450"/>
</key-property>
<key-property name="name">
<column name="Name" sql-type="nvarchar(450)" length="450"/>
</key-property>
</composite-id>
<property name="value">
<column name="Value" sql-type="nvarchar(max)" length="2147483647" not-null="true"/>
</property>
</class>
</hibernate-mapping>
还有我的 ApplicationContext
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="url" value="jdbc:sqlserver://Data Source=localhost;Initial Catalog=DB;Integrated Security=True" />
<property name="username" value="sa" />
<property name="password" value="123" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>UserTokens.hbm.xml</value>
</list>
</property>
</bean>
</beans>
我知道表有 3 个主表,但我不明白我的错在哪里。 当我想用这个模型创建数据库时,这给了我一个错误,我无法解决它
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [ApplicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: expecting IdClass mapping
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1783) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:849) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.2.0.M3.jar:2.2.0.M3]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782) ~[spring-boot-2.2.0.M3.jar:2.2.0.M3]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:404) ~[spring-boot-2.2.0.M3.jar:2.2.0.M3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:319) ~[spring-boot-2.2.0.M3.jar:2.2.0.M3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1275) ~[spring-boot-2.2.0.M3.jar:2.2.0.M3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1263) ~[spring-boot-2.2.0.M3.jar:2.2.0.M3]
at oauth.identity.IdentityApplication.main(IdentityApplication.java:12) ~[classes/:na]
Caused by: java.lang.IllegalArgumentException: expecting IdClass mapping
at org.hibernate.metamodel.internal.AttributeFactory$3.resolveMember(AttributeFactory.java:977) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.metamodel.internal.AttributeFactory$5.resolveMember(AttributeFactory.java:1035) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.metamodel.internal.AttributeFactory.determineAttributeMetadata(AttributeFactory.java:450) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.metamodel.internal.AttributeFactory.buildIdAttribute(AttributeFactory.java:139) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.metamodel.internal.MetadataContext.buildIdClassAttributes(MetadataContext.java:389) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.metamodel.internal.MetadataContext.applyIdMetadata(MetadataContext.java:319) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.metamodel.internal.MetadataContext.wrapUp(MetadataContext.java:222) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:274) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:294) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:615) ~[spring-orm-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:599) ~[spring-orm-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1842) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1779) ~[spring-beans-5.2.0.M2.jar:5.2.0.M2]
... 16 common frames omitted
【问题讨论】:
-
不要混用 hbm.xml 映射和注解映射。选择其中之一。此外,我个人不喜欢对 getter/setter 方法进行注释。我更喜欢将它们直接放在田野上,这样就不会发生错误将它们放在错误的地方
-
为什么你还有一个 hbm.xml。你不需要那个
-
我是 java 新手,但我知道 hbm.xml 是必要的。你的意思是有办法在没有 hbm.xml 文件的情况下创建数据库??
-
如果您使用注释,则不需要 @sahraair hbm.xml。仅使用基于 xml 的配置或基于注解的配置之一进行休眠
-
我的朋友们感谢您的帮助。但是当我删除注释时,它给了我同样的错误
标签: java hibernate spring-boot