我正在尝试使用实体作为 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/