Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 运行时生成实体的通用JPA存储库_Spring_Generics_Spring Data Jpa_Spring Data Rest - Fatal编程技术网

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

Spring 运行时生成实体的通用JPA存储库,spring,generics,spring-data-jpa,spring-data-rest,Spring,Generics,Spring Data Jpa,Spring Data Rest,在我的场景中,我在运行时在“com.mrg.domain”包下生成hibernate实体类。在我的通用restcontroller中,我可以根据@PathVariable创建这些实体的实例。下面的代码适用于此 @RequestMapping( value = "/{entity}", method = RequestMethod.POST) public @ResponseBody RestResponse createEntity(@PathVariable String entity, @R

在我的场景中,我在运行时在“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());
}
@RequestMapping(value=“/{entity}”,method=RequestMethod.POST)
public@ResponseBody response createEntity(@PathVariable String entity,@RequestBody String RequestBody){
对象模型=null;
ObjectMapper mapper=新的ObjectMapper();
试一试{
//例如:如果{entity}param等于“post”,则modelName将为“post”
字符串modelName=Character.toUpperCase(entity.charAt(0))+entity.substring(1);
//根据modelName创建新实例
Class clazz=Class.forName(“com.mrg.domain.+modelName”);
model=clazz.newInstance();
//正在将@RequestBody json字符串转换为域对象。。
model=mapper.readValue(requestBody,clazz);
}捕获(例外情况除外){
//TODO处理异常并通知用户。。
}   
返回新的Response(model.toString());
}
现在,我尝试实现的下一步是一个通用jpa存储库(如下所示),这样我就可以持久化运行时生成的模型,而无需为每个实体实现存储库。但是还没有找到解决办法

@Repository
public interface GenericRepository<T> extends PagingAndSortingRepository<T, Long>{  }
@存储库
公共接口GenericRepository扩展了分页和排序存储库{}
下面的主题和许多其他主题实现了通用存储库,但也实现了使用通用repo的每个实体的存储库。因为我有运行时生成的实体,所以每个实体的repo实现对我来说不起作用

有什么建议或实现这一目标的方法吗?我不熟悉泛型和反射,所以如果我试图实现的是不可能的,请告诉我原因,我将不胜感激


谢谢大家,

您可以使用此模式。这一个使用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());
    ............
}
}
@无状态
公共抽象类抽象存储库{
@持久上下文
受保护的实体管理器em;
公共抽象类getActualClass();
公共T getSingleResult(映射参数){
//基于参数构建querytext
TypedQuery query=em.createQuery(queryText.toString(),getActualClass());
............
}
}
现在来看实现类:

@Stateless
public class InputStreamRepository extends AbstractRepository<InputDataStream> {

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

}
@无状态
公共类InputStreamRepository扩展了AbstractRepository{
@凌驾
公共类getActualClass(){
返回InputDataStream.class;
}
}

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

您可以使用此模式。这一个使用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());
    ............
}
}
@无状态
公共抽象类抽象存储库{
@持久上下文
受保护的实体管理器em;
公共抽象类getActualClass();
公共T getSingleResult(映射参数){
//基于参数构建querytext
TypedQuery query=em.createQuery(queryText.toString(),getActualClass());
............
}
}
现在来看实现类:

@Stateless
public class InputStreamRepository extends AbstractRepository<InputDataStream> {

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

}
@无状态
公共类InputStreamRepository扩展了AbstractRepository{
@凌驾
公共类getActualClass(){
返回InputDataStream.class;
}
}

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

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

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;
    }

}
import java.util.List;
导入org.bson.Document;
导入org.json.JSONObject;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.data.mongodb.core.MongoTemplate;
导入org.springframework.http.HttpStatus;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.CrossOrigin;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.PathVariable;
导入org.springframework.web.bind.annotation.PostMapping;
导入org.springframework.web.bind.annotation.RequestBody;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
@RestController
@请求映射(“/api/generic”)
@交叉原点(原点={“*”})
公共类泛型控制器{
@自动连线
私有MongoTemplate MongoTemplate;
@邮戳
公共响应属性addData(@RequestBody字符串数据){
JSONObject JSONObject=新的JSONObject(数据);
String documentName=jsonObject.getString(“documentName”);
Document doc=Document.parse(数据);
Document insertedoc=mongoTemplate.insert(doc,documentName);
返回新的响应状态(insertedoc,HttpStatus.CREATED);
}
@GetMapping(“/{documentName}”)
公共列表getData(@PathVariable String documentName){
List allData=mongoTemplate.findAll(Document.class,documentName);
返回所有数据;
}
}

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

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;
    }

}
import java.util.List;
导入org.bson.Document;
导入org.json.JSONObject;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.data.mongodb.core.MongoTemplate;
导入org.springframework.http.HttpStatus;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.CrossOrigin;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.PathVariable;
导入org.springframework.web.bind.annotation.Pos