java - 在 Hibernate 中使用实体作为 DTO

标签 java spring hibernate

我正在尝试使用实体作为 DTO。在这里,我使用对象的 setter 设置数据,但是当我获取数据时,会执行查询,尝试获取数据库中未保存的设置对象 以下是我的代码。在此处设置 MailJob 和邮件队列中的数据我收到以逗号分隔的电子邮件值列表:

List<String> emailList = Arrays.asList(mailQueueDto.getToMail().split(","));

List<MailQueue>  mailQueues = new ArrayList<>();
MailJobs mailJobs = new MailJobs();
mailJobs.setFromEmail(mailQueueDto.getFromEmail());
mailJobs.setMailMessage(mailQueueDto.getMailMessage());
mailJobs.setSubject(mailQueueDto.getSubject());
mailJobs.setPassword(mailQueueDto.getPassword());
mailJobs.setId(null);
for (String en : emailList) {
    String[] parts = en.split(":");
    MailQueue m = new MailQueue();
    m.setEmail( parts[0]);
    m.setName( parts[1]);
    m.setMailJobs(mailJobs);
    mailQueues.add(m);
}
mailSchedulerService.pushQueue(mailQueues);

现在,我尝试使用 PushQueue 方法来获取相同的数据集。我这样做是为了可重用性。一旦使用 get 获取对象,它就会尝试合并到数据库,然后执行查询,这在此处不需要。

public void pushQueue( List<MailQueue> mailQueue) throws MessagingException {
    logger.info("Mail Q--->"+mailQueue);
    Session session = getSession();
    Transport t = session.getTransport();
    t.connect();
    try {
        for (MailQueue mQ : mailQueue) {
            //logger.debug("Market->>"+ mQ );
            if(mQ.getEmail().isEmpty())
                continue;
            Message m = getMailMessage(  session,
                    mQ.getMailJobs().getSubject(),
                    mQ.getMailJobs().getMailMessage().replace("%name%",mQ.getName()),
                    mQ.getMailJobs().getFromEmail(),mQ.getEmail());
            t.sendMessage(m, m.getAllRecipients());

            mailQueueService.deleteById(mQ.getId());
        }
    }
    catch (Exception e){
        e.printStackTrace();
    }
    finally {
        t.close();
    }
}

抛出以下异常:

org.springframework.dao.EmptyResultDataAccessException: No class >  MailQueue entity with id 0 exists!
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.lambda$deleteById$0(SimpleJpaRepository.java:176)
    at java.util.Optional.orElseThrow(Optional.java:290)
    at org.springframework.data.jpa.repository.support.Simp

邮件队列实体

package com.iitraa.alumnus.iitAlumnus.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;

import javax.persistence.*;

    @Data
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @Entity
    public class MailQueue  {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private  int id;
        private String name;
        private String email;
        @ManyToOne( cascade = CascadeType.ALL  ,fetch = FetchType.LAZY)
        private MailJobs mailJobs;

        private boolean complete;
        
        public void setName(String name) {
            this.name = name;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public void setMailJobs(MailJobs mailJobs) {
            this.mailJobs = mailJobs;
        }

        public String getName() {
            return name;
        }

        public String getEmail() {
            return email;
        }
        
        @JsonIgnore
        public MailJobs getMailJobs() {
            return mailJobs;
        }

        public int getId() {
            return id;
        }

        public boolean isComplete() {
            return complete;
        }

        public void setComplete(boolean complete) {
            this.complete = complete;
        }

    }

基本上我试图使用这个实体作为 POJO 及其 getter 和 setter 来设置然后获取数据而不保存,但是执行查询并抛出错误。如何防止这种情况发生?

最佳答案

删除以下代码,因为它可能会调用和删除数据库中的相关对象

mailQueueService.deleteById(mQ.getId());

关于java - 在 Hibernate 中使用实体作为 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63122573/

相关文章:

java - Maven Shade 插件 - 如何包含测试类和测试资源?

java - 在这种情况下如何使用 DISTINCT 创建 hibernate 条件

java - Spring MVC + 2 JNDI 数据源

java - Hibernate 标准一对多问题

java - 收到错误消息说类未与命名查询映射

java - 如何在 Hibernate 中使用 Java 接口(interface)?

java - Runtime.getRuntime.exec() 适用于 Windows 但不适用于 Linux

java - 什么是堆栈跟踪,我如何使用它来调试我的应用程序错误?

java - java.io.Serialized 使用哪个哈希函数?

Spring REST - 将 GET 参数绑定(bind)到嵌套对象