CrudRepository不从API返回数据库元素

时间:2017-04-30 05:31:04

标签: java spring hibernate rest jpa

我正在构建一个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_itemnews_source(我还有一个新闻来源实体)。填充的表格为newsitemnewssource

如果需要任何进一步的信息来提供答案,请告诉我。

1 个答案:

答案 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 {}