gpt4 book ai didi

java - Hibernate @OneToMany/@ManyToOne 列未找到

转载 作者:行者123 更新时间:2023-11-30 06:45:47 26 4
gpt4 key购买 nike

尝试使用 Spring-Boot 为我的 Web 应用程序调用 REST API 时,出现“未找到列”错误, HibernateCrudRepository界面。

我有两个实体,一个新闻源和一个新闻项。新闻来源(例如:Abc News)有许多新闻项目。

@Entity
@Table(name="newsitem")
public class NewsItem

@ManyToOne
private NewsSource newsSource;

@JsonIgnoreProperties(ignoreUnknown=true)
@Entity
@Table(name="newssource")
public class NewsSource

@OneToMany(mappedBy = "newsSource", cascade = CascadeType.ALL)
private List<NewsItem> newsItems;

我的两个表都已正确填充,可以在我的 H2 控制台中进行验证。

关系注释在我的 NewsItem 中添加了一列表名为 Newssource_id 。但是,它不会自动填充。因此,我添加了代码,以便在从外部 API 获取项目时分配它。

 public Future<List<NewsItem>> fetchAllNewsItemsFromApi(){
List<NewsSource> sources = newsSourceDao.fetchAllNewsSources();
List<NewsItem> newsItems = new ArrayList<>();
for (NewsSource source : sources) {
String request = "https://newsapi.org/v1/articles?apikey=" + NEWSAPI_API_KEY + "&source=" + source.getId();
ResponseEntity<NewsItemResponse> newsItemResponse =
restTemplate.exchange(request,
HttpMethod.GET, null, NewsItemResponse.class);
NewsItemResponse response = newsItemResponse.getBody();
List<NewsItem> itemsFromSource = response.getNewsItemList();
for (NewsItem item : itemsFromSource){
item.setNewsSource(source);
}
newsItems.addAll(itemsFromSource);
}
return new AsyncResult<>(newsItems);
}

我必须创建两个额外的响应类,因为 NewsApi JSON 除了文章/来源之外还返回元数据。

public class NewsItemResponse {
@JsonProperty("articles")
private List<NewsItem> newsItemList;

public class NewsSourceResponse {
@JsonProperty("sources")
private List<NewsSource> sourceList;

我已经像这样设置了 NewsItemRepository:

public interface NewsItemRepository extends CrudRepository<NewsItem, Long>{}

还有我的http://localhost:8080/api/v1看起来像这样:

{
"_links" : {
"newsItems" : {
"href" : "http://localhost:8080/api/v1/newsItems"
},
"profile" : {
"href" : "http://localhost:8080/api/v1/profile"
}
}
}

当我导航到 http://localhost:8080/api/v1/newsItems 时我收到 500 错误。

在浏览器中:

could not prepare statement; SQL [select newsitem0_.id as id1_0_, newsitem0_.version as version2_0_, newsitem0_.author as author3_0_, newsitem0_.date as date4_0_, newsitem0_.news_source_id as news_sou9_0_, newsitem0_.summary as summary5_0_, newsitem0_.title as title6_0_, newsitem0_.url as url7_0_, newsitem0_.url_to_image as url_to_i8_0_ from newsitem newsitem0_]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement

在 IntelliJ 中:

org.h2.jdbc.JdbcSQLException: Column "NEWSITEM0_.NEWS_SOURCE_ID" not found; SQL statement:
select newsitem0_.id as id1_0_, newsitem0_.version as version2_0_, newsitem0_.author as author3_0_, newsitem0_.date as date4_0_, newsitem0_.news_source_id as news_sou9_0_, newsitem0_.summary as summary5_0_, newsitem0_.title as title6_0_, newsitem0_.url as url7_0_, newsitem0_.url_to_image as url_to_i8_0_ from newsitem newsitem0_ [42122-191]

Sample row from my NewsItem table

Sample row from my NewsSource table

NewsApi.org Api

最佳答案

框架似乎试图在驼峰式的基础上添加额外的下划线。这似乎违反了默认的 JPA 行为,默认的 JPA 行为应该只在关系名称和外部 id 之间添加下划线。

无论如何..尝试显式定义连接列:

@ManyToOne
@JoinColumn(name="newssource_id")
private NewsSource newsSource;

关于java - Hibernate @OneToMany/@ManyToOne 列未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43709898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com