当前位置: 首页 > 知识库问答 >
问题:

运行时生成的实体的通用JPA存储库

柳俊彦
2023-03-14

在我的场景中,我在运行时在“com.mrg.domain”包下生成hibernate实体类。在我的通用restcontroller中,我可以根据@PathVariable创建这些实体的实例。以下代码适用于此。。

@RequestMapping( value = "/{entity}", method = RequestMethod.POST)
public @ResponseBody RestResponse createEntity(@PathVariable String entity, @RequestBody String requestBody) {

    Object model = null;    
    ObjectMapper mapper = new ObjectMapper();

    try {
        // ex : if {entitiy} param is equal "post" modelName will be "Post"
        String modelName = Character.toUpperCase(entity.charAt(0)) + entity.substring(1);

        // Creating a new instance according to modelName
        Class<?> clazz = Class.forName("com.mrg.domain." + modelName);
        model = clazz.newInstance();

        // Converting @RequestBody json String to domain object..
        model = mapper.readValue(requestBody, clazz);

    } catch(Exception ex){

        // TODO handle exceptions & inform user..
    }   

    return new RestResponse(model.toString());
}

现在,我试图实现的下一步是一个通用的jpa存储库(如下所示),这样我就可以持久化运行时生成的模型,而无需为每个实体实现存储库。但是还没有找到解决方案。

@Repository
public interface GenericRepository<T> extends PagingAndSortingRepository<T, Long>{  }

下面的主题和许多其他主题实现了通用存储库,但也实现了使用通用存储库的每个实体的存储库。由于我有运行时生成的实体,因此每个实体的存储库实现对我不起作用…

如何制作通用 jpa 存储库?我应该这样做吗?为什么?

有什么建议或方法可以实现这一点吗?我是泛型和反射的新手,所以如果我试图完成的事情不可能,请告诉我原因,我将不胜感激…

谢谢和问候,

共有2个答案

萧业
2023-03-14

我有一个反应应用程序,其中在 JSON 和服务器端定义了不同的数据,我需要将其存储在数据库中。我最初的方法是为所有这些分别创建实体、存储库和控制器。但是CRUD操作的另一种可能方法是使用MongoDB

import java.util.List;

import org.bson.Document;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/generic")
@CrossOrigin(origins = { "*" })
public class GenericController {

    @Autowired
    private MongoTemplate mongoTemplate;

    @PostMapping
    public ResponseEntity<Document> addData(@RequestBody String data) {
        JSONObject jsonObject = new JSONObject(data);
        String documentName = jsonObject.getString("documentName");
        Document doc = Document.parse(data);
        Document insertedDoc = mongoTemplate.insert(doc, documentName);
        return new ResponseEntity<>(insertedDoc, HttpStatus.CREATED);

    }

    @GetMapping("/{documentName}")
    public List<Document> getData(@PathVariable String documentName) {
        List<Document> allData = mongoTemplate.findAll(Document.class, documentName);
        return allData;
    }

}
公冶嘉茂
2023-03-14

你可以使用这种模式。这一个使用EJB,但可以在Spring等中使用。

@Stateless
public abstract class AbstractRepository<T> {

@PersistenceContext
protected EntityManager em;

public abstract Class<T> getActualClass();

public T getSingleResult(Map<String, String> params) {

    // build querytext based on params
    TypedQuery<T> query = em.createQuery(queryText.toString(), getActualClass());
    ............
}
}

现在对于实现类:

@Stateless
public class InputStreamRepository extends AbstractRepository<InputDataStream> {

@Override
public Class<InputDataStream> getActualClass() {
    return InputDataStream.class;
}

}

getActualClass 方法将为您提供实体的类包含信息。

 类似资料:
  • 我正在使用Byte Buddy生成JPA实体和JPA存储库。我能够生成JPA实体,但无法继续生成相应的JPA存储库。以下是代表个人和实体的代码, 我可以使用Bute Buddy生成上述内容,如下所示, 现在我想生成相应的Spring boot Jpa报告,如下所示, 如何用Generic属性创建这个接口。这也能(使用动态代码生成)持久化Person对象吗?

  • 我有几个实体,并使用Spring Data JPA存储库与规范查询我的数据库。因此,我创建了一个泛型类< code>SpecBuilder来基于查询描述(< code>MyQueryDescriptor)构建我的查询。 我的存储库: 和 现在有三件事我不太确定:< br> 1) 使用泛型SpecBuilder是一个干净的设计吗? 2) 有没有办法避免为每个实体编写这些存储库接口?假设一个通用存储库

  • 我有一个通用实体,我想使用JPA持久化,以便它的通用值存储在单个列中。简化的实体类如下所示: 类型唯一标识泛型值的类,并且允许具有相同类的多个类型: 我没有找到如何使用Hibernate保持这种泛型类的方法。我找到了替代方法和变通方法,但它们在我看来并不理想。我考虑了以下选项: > 将值的类型设置为JsonNode,并将其类型类标记为com。弗拉德米尔恰。冬眠类型json。JsonBinaryTy

  • 问题内容: 我已经为Entity Framework 4实现了通用存储库。这是一个简化版本,其中AllAppContainer是EF4对象上下文: 一种方法是QueryCount(),我想将其用作 select Count(*)… SQL行(不返回实际记录)。 直截了当?您可能会想…首先,让我们做同一件事的非存储库版本,对Item实体进行计数: SQL Server Profiler说生成的SQL

  • 我正在工作的Spring引导应用程序。 我们有服务层、Rest控制器和Dao作为存储库。 我想做的是,我将编写一个扩展CrudRepository的BaseRepository,BaseRepository应该接受所有的实体并执行持久操作。 有办法吗??

  • 我创建了一个基本的Spring MVC / JPA / Hibernate应用程序。我试图保存一个UserProfile实体来测试我是否真的可以持久化它,但是什么也没有保存,也没有抛出异常。 在控制器方法中,我创建了一个简单的UserProfile(这是一个@Entity),并将其发送到服务方法。类使用 @Service 对类进行批注,并使用 @Transactional 对 addUserPro