我的实体具有 OneToMany 关系。下面是代码:
实体类:
@Data
@Entity
@Table(name = "TEST_LADDER", schema = "TEST_DBO")
public class LadderEntityTemp implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "LADDER_SEQUENCE_ID", nullable = false, insertable = true)
protected UUID ladderSequenceId;
@Column(name = "LADDER_ID")
protected String ladderId;
@Column(name = "LADDER_ACCOUNT_NBR")
protected String ladderAccountNbr;
and more.....
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "ladderEntityTemp")
private List<RungEntityTemp> ladderRungs;
}
@Data
@Entity
@Table(name = "TEST_LADDER_RUNG", schema = "TEST_DBO")
public class RungEntityTemp implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "LADDER_RUNG_SEQUENCE_ID", nullable = false, insertable = true, table = "")
private UUID ladderRungSequenceId;
@Column(name = "LADDER_SEQUENCE_ID")
protected UUID ladderSequenceId;
@Column(name = "LADDER_RUNG_NBR")
protected Integer ladderRungNbr;
and more.....
@ManyToOne(fetch = FetchType.LAZY, optional = false)
private LadderEntityTemp ladderEntityTemp;
}
存储库类:
@Repository
public interface LaddersRepositoryTemp extends JpaRepository<LadderEntityTemp, UUID> {
@Query(value = "SELECT * from TEST_DBO.TEST_LADDER ld where ld.LADDER_ACCOUNT_NBR = :accountNum", nativeQuery = true)
List<LadderEntityTemp> tempQuery(String accountNum);
}
数据库配置类:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.temp.repositories",
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef= "transactionManager")
public class DatabaseConfig {
private static final String BASE_PACKAGE = "com.temp.model.entities";
@Primary
@Bean(name = "tempDatasource")
@ConfigurationProperties(prefix = "temp.datasource")
public DataSource tempDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("tempDatasource") DataSource tempDatasource) {
Map<String,Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", "none");
properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle12cDialect");
properties.put("oracle.net.encryption_client", "REQUIRED");
properties.put("oracle.net.encryption_types_client", "( AES256 )");
return builder.dataSource(tempDatasource).packages(BASE_PACKAGE).properties(properties).build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
jpa 的pom.xml 代码片段:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.8</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
打电话时
List<LadderEntityTemp> ladderEntityList = laddersRepository.tempQuery(accountNumber);
我在日志中发现 JPA 尝试执行以下 2 个查询:
自定义查询 - 休眠:从 TEST_DBO.TEST_LADDER ld 中选择 *,其中 ld.LADDER_ACCOUNT_NBR = ?
A JPQL - 休眠:从 TEST_DBO.TEST_LADDER_RUNG l1_0 选择 l1_0.ladderEntityTemp_LADDER_SEQUENCE_ID、l1_0.LADDER_RUNG_SEQUENCE_ID、l1_0.LADDER_RUNG_NBR、l1_0.LADDER_SEQUENCE_ID,其中 l1_0.ladderEntityTemp_LADDER_SEQ UENCE_ID=?
并出现以下错误:
警告 org.hibernate.engine.jdbc.spi.SqlExceptionHelper 133:Local-1:SQL 错误:904,SQLState:42000 错误org.hibernate.engine.jdbc.spi.SqlExceptionHelper 138:Local-1:ORA-00904:“L1_0”。“LADDERENTITYTEMP_LADDER_SEQUENCE_ID”:无效标识符
2024-04-25 12:10:35 错误 com.temp.controller.LadderController 120:Local-1:梯形 API 错误:搜索库存和保存模型梯形请求中出现异常: org.hibernate.exception.SQLGrammarException:执行 SQL 时出现 JDBC 异常 [select l1_0.ladderEntityTemp_LADDER_SEQUENCE_ID,l1_0.LADDER_RUNG_SEQUENCE_ID,l1_0.LADDER_RUNG_NBR,l1_0.LADDER_SEQUENCE_ID from TEST_DBO.FIXED_INCOME_LADDER_RUNG l1_0 其中 l1_0.ladder EntityTemp_LADDER_SEQUENCE_ID=?] 在 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:64) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
在谷歌搜索此问题后,我尝试了几个选项,通过添加以下属性来至少阻止错误:
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
但没有任何效果。
问题:
你错过了 JoinColumn 注释
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "YOUR_FOREIGN_KEY_COLUMN_NAME")
private LadderEntityTemp ladderEntityTemp;
``