首页 > 解决方案 > 想要手动反序列化我的 Hibernate 实体。有没有办法模仿@GeneratedValue?

问题描述

春季启动新手在这里。我正在为我的一个数据库实体创建一个反序列化类,但是当我以这种方式反序列化时,似乎没有调用 @GeneratedValue 并且没有创建 id。

数据库似乎对空 id 没有问题,但我需要 id。

有没有更好的方法以这种方式进行反序列化?

这是有问题的@Entity 类。

@Entity
public class ListComparison <T extends ListData> {

    @GeneratedValue
    @Id
    public Long id;


    @JsonIgnore
    public String listElementClass;

    @JsonIgnore
    public int listlength;

    @JsonIgnore
    @OneToMany(cascade= {CascadeType.ALL},mappedBy="listComparison", targetEntity = TimeEntity.class)
    Map<String,TimeEntity> arrayListTimes;

    @JsonIgnore
    @OneToMany(cascade= {CascadeType.ALL},mappedBy="listComparison", targetEntity = TimeEntity.class)
    Map<String,TimeEntity> linkedListTimes;

    @JsonIgnore
    @OneToMany(mappedBy="listComparison",targetEntity=ListData.class)
    public List<T> list;

    @JsonIgnore
    @Transient
    private Class<T> listComparisonClass;

    @JsonIgnore
    @Transient
    private static final String[] times = {"Sort","Insert","Delete"};



    public Long getID() {
        return this.id;
    }


    public ListComparison() {

        System.out.println(id);
        this.id = 0L;

        //hashmaps to store times for each operation
        arrayListTimes = new HashMap<String,TimeEntity>();
        linkedListTimes = new HashMap<String,TimeEntity>();

        //initializes the map
        for (String i: times) {
        arrayListTimes.put(i, TimeEntity.getTimeEntity(0));
        linkedListTimes.put(i,TimeEntity.getTimeEntity(0));
        }


    }


    public void generateLists(Class listType) {

        this.listElementClass = listType.getSimpleName();

        this.list = new ArrayList();

        this.listlength=list.size();



        /*if (listElementClass.equals(String.class)) {
            for (int i = 0; i < listlength; i++) {

                arrayList.add((T) (Comparable) string);
                linkedList.add((T) (Comparable)string);
            }
        } else if(listElementClass.equals(Computer.class)) {
            Random random = new Random();
                for (int i =0; i < listlength; i++) {
                    Computer computer = new Computer((int)(128+random.nextFloat()*(2000-128)), "Computer: "+String.valueOf(i+1));

                    arrayList.add((T) (Comparable)computer);
                    linkedList.add((T) (Comparable)computer);
                }
        } else {
            Random random = new Random();
            for (int i = 0; i < listlength; i++) {

                //sets the range of numbers
                Integer integer = (int) (0+random.nextFloat()*(10-0));
                arrayList.add((T) (Comparable)(integer));
                linkedList.add((T) (Comparable)(integer));
            }

        }*/
    }

    public ListData createElement(String elementData) {

        String elementdata = elementData;


        if (listElementClass.equals("String")) {
                return new ListData(elementData);

        } else if (listElementClass.equals("Computer")) {
                /*if (elementData.size()==2 && elementData.get("1") != null) {
                    return (ListData) (Comparable) new Computer(elementdata[0], Integer.parseInt(elementdata[1]));
                } else {
                */    return new ListData(new Computer(elementdata));
                //}

        } else {
                return new ListData(Integer.parseInt(elementData));
            }


    }

这是采用反序列化对象的映射函数(在 RESTful 控制器中)。我希望它返回带有纯文本正文的 ResponseEntity,我可以在客户端接收到该正文。那里一切都很好,除了当我尝试获取 id 时,它返回 null。

@PostMapping(value ="/labs/Vihan/ListComparison/", produces= MediaType.TEXT_PLAIN_VALUE, consumes= MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity createListWithType(@RequestBody ListComparison listComparison) throws JsonProcessingException {

        String test = listComparison.getID().toString();
        System.out.println(test);
        return ResponseEntity.ok("test");



    }

这是反序列化器类

public class ListComparisonDeserializer extends JsonDeserializer<ListComparison> {

    @Override
    public ListComparison deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {

        Map dictionary = ListRestController.getDictionary();

        JsonNode node = jp.getCodec().readTree(jp);
        String type = node.get("type").textValue();

        if (dictionary.containsKey(type)) {

            ListComparison listComparison = new ListComparison();
            listComparison.generateLists((Class) dictionary.get(type));

          return listComparison;

        } else {
            throw new ListTypeNotFoundException(type);
        }
    }
}

这是我发送到该映射的 json

{
 'type': 'Integer'
}

标签: javaspring-bootspring-data-jpa

解决方案


推荐阅读