我正在嘗試使用Spring構建帶有身份驗證的安全REST API,
。我以以下方式創建了User類:
package com.example.soasec.entities;
import javax.persistence.*;
import java.util.List。
@Entity.
public class User extends BaseEntity{
private String username;
private String password;
@OneToMany(fetch = FetchType. EAGER, cascade=CascadeType.ALL)
private List<Role> roles。
private boolean active。
public String getUsername() {
return用戶名。
}
public void setUsername(>String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
IDE在這一行拋出一個錯誤 private List<Role> roles;,當我點擊它時,出現以下資訊。
'一對多'的屬性值型別不應該是'角色'.
角色類:
package com.example.soasec.entities。
import javax.persistence.GeneratedValue。
import javax.persistence.Id;
public class Role {
@Id
@GeneratedValue
private Long id。
String name。
Role(){}。
public Role(String name) {this.name=name; }
public String getName() {return name; }
public void setName(String name) {this.name= name; }
另外,當我試圖編譯時,我有這樣的問題
Error starting ApplicationContext. 為了顯示條件報告重新運行你的應用程式與 'debug'啟用。
2021-09-21 19:02:04。 782 ERROR 7692 --- [restartedMain] o.s.boot.SpringApplication : Application run failed。
org.springframework.beans.factory.BeanCreationException。Error創建bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class] 。呼叫of init方法失敗;嵌套例外是 org.hibernate.AnnotationException。Use of @OneToMany or @ManyToMany targeting an unmapped class: com.example.soasec.entities.User.role[com.example.soasec.entities.Role]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) ~[spring-beans-5.3.9.jar:5.3.9]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) ~[spring-beans-5.3.9.jar:5.3.9]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.9.jar:5.3.9]
在org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory. java:335) ~[spring-beans-5.3.9.jar:5.3.9]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5. 3.9.jar:5.3.9]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5。 3.9.jar:5.3.9]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5. 3.9.jar:5.3.9]
在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext. java:1154) ~[spring-context-5。 3.9.jar:5.3.9]
在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext. java:908) ~[spring-context-5。 3.9.jar:5.3.9]
在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext. java:583) ~[spring-context-5. 3.9.jar:5.3.9]
在org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.4.jar:2.5.4]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2. 5.4.jar:2.5.4]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-2. 5.4.jar:2.5.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:338) ~[spring-boot-2. 5.4.jar:2.5.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2. 5.4.jar:2.5.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2. 5.4.jar:2.5.4]
at com.example.soasec.SoasecApplication.main(SoasecApplication.java:10) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2. 5.4.jar:2.5.4]
原因是:org.hibernate.AnnotationException。Use of @OneToMany or @ManyToMany targeting an unmapped class: com.example.soasec.entities.User.role[com.example.soasec.entities.Role]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1351) ~[hibernate-core-5. 4.32.Final.jar:5.4.32.Final]
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:874) ~[hibernate-core-5。 4.32.Final.jar:5.4.32.Final]
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:799) ~[hibernate-core-5。 4.32.Final.jar:5.4.32.Final]
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:53) ~[hibernate-core-5。 4.32.Final.jar:5.4.32.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1693) ~[hibernate-core-5。 4.32.Final.jar:5.4.32.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1661) ~[hibernate-core-5。 4.32.Final.jar:5.4.32.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295) ~[hibernate-core-5。 4.32.Final.jar:5.4.32.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5. 4.32.Final.jar:5.4.32.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5。 4.32.Final.jar:5.4.32.Final]
在org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.9.jar:5.3.9]
在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.9.jar:5.3.9]
在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean. java:409) ~[spring-orm-5.3.9.jar:5.3.9]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5。 3.9.jar:5.3.9]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.9.jar:5.3.9]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845) ~[spring-beans-5.3.9.jar:5.3.9]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-5.3.9.jar:5.3.9]
... 21普通框架被省略了
我怎樣才能解決這個問題?
有用的資訊:Java 版本:11
JDK: openjdk-17
IntelliJ IDEA版本:2021.2.2Spring boot版本:2.5.4uj5u.com熱心網友回復:
你需要在Role.java中用@ManyToOne注解來宣告user屬性:
@Entity
public class Role {
@Id
@GeneratedValue
private Long id。
String name。
Role(){}。
@ManyToOne
public User user;
public Role(String name) {this.name=name;}
public String getName() {return name; }
public void setName(String name) {this.name= name; }
而在User.java中,用@OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)替換:@OneToMany(mappedBy = "user")
uj5u.com熱心網友回復:
你有兩個選擇來解決這個問題。
1) 使Role成為一個物體
@Entity
public class Role {
@Id
@GeneratedValue
private Long id;
字串名稱。
角色(){}。
public Role(String name) {this.name=name; }
public String getName(){return name; }
public void setName(String name) {this.name= name; }
}
2) 使Role可嵌入
在這種情況下,這些元素完全由User擁有。所有的操作都被級聯到Role串列。Role沒有自己的生命周期,也不能單獨被查詢。
@Embeddable。
public class Role {
@Id
@GeneratedValue
private Long id;
字串名稱。
角色(){}。
public Role(String name) {this.name=name; }
public String getName(){return name; }
public void setName(String name) {this.name= name; }
}
你還需要對User做一些修改:
@Entity
public class User extends BaseEntity{
private String username;
private String password;
@ElementCollection
private List<Role> roles;
private boolean active;
}
在這里你可以使用@CollectionTable,如果你想定制集合表。如果缺少@CollectionTable注解,則適用@CollectionTable注解元素的默認值。參考檔案。https://docs.oracle.com/javaee/7/api/javax/persistence/CollectionTable.html.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331337.html
標籤:
