我正在构建一个Spring启动应用程序,它将数据填充到hibernate数据库中。我编写了DAO,它从外部API中提取数据并将它们加载到我的数据库中(这很好)。但是,我想使用CrudRepository
为我的数据生成REST API。所以我创建了一个扩展它的NewsItemRepository
。
public interface NewsItemRepository extends CrudRepository<NewsItem, Long>
我的NewsItemDao
是数据库的持久性和提取性:
@Override
public List<NewsItem> fetchAllNewsItems() {
EntityManager entityManager = entityManagerFactory.createEntityManager();
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<NewsItem> criteria = builder.createQuery(NewsItem.class);
Root<NewsItem> newsItemRoot = criteria.from(NewsItem.class);
criteria.orderBy(builder.desc(newsItemRoot.get("date")));
List<NewsItem> newsItemList = entityManager.createQuery(criteria).getResultList();
entityManager.close();
return newsItemList;
}
@Override
public void save(NewsItem newsItem) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(newsItem);
entityManager.getTransaction().commit();
entityManager.close();
}
API功能似乎正在运行(localhost:8080 / api / v1):
{
"_links" : {
"newsItems" : {
"href" : "http://localhost:8080/api/v1/newsItems"
},
"profile" : {
"href" : "http://localhost:8080/api/v1/profile"
}
}
}
但是,newsItems没有在localhost中填充:8080 / api / v1 / newsItems:
{
"_embedded" : {
"newsItems" : [ ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/api/v1/newsItems"
},
"profile" : {
"href" : "http://localhost:8080/api/v1/profile/newsItems"
}
}
}
我可以从数据库中访问newsItem并显示它们。但我想让API功能正常工作,我不知道我缺少什么让它工作。我注意到我的数据库中添加了两个额外的空白表,我没有指出要发生/指定其名称。 news_item
和news_source
(我还有一个新闻来源实体)。填充的表格为newsitem
和newssource
。
如果需要任何进一步的信息来提供答案,请告诉我。
答案 0 :(得分:1)
你在DB中获取新表的原因是,默认情况下,hibernate会将你的POJO实体映射到其非等级的类名,即NewsItem到news_item,你可能已经在persistence.xml中指定了
hibernate.hbm2ddl.auto = create-drop |更新
这有两个解决方案 1.您使用hibernate默认使用的约定,并将表重命名为news_item和news_source 2.您可以在POJO类的顶部指定表名
@Entity
@Table(name="newsitem")
public class NewsItem implements Serializable {}