将DTO映射到现有的实体,它是创建新的实体。

问题描述 投票:0回答:1

我有Activity类和ActivityDTO,如下图所示。当保存新的实体时没有问题,但是如果我想更新现有的实体,那么它正在创建新的实体,尽管我的实体id是来自我的数据库实体。

@Getter
@Setter
@Entity
public class Activity implements Serializable {

@Id
@Column(name = "ID")
@GeneratedValue
@SequenceGenerator
private Long id;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval=true)
@JoinTable(name = "ACTIVITY_ATTACHMENT", joinColumns = {
        @JoinColumn(name = "ACTIVITY_ID") }, inverseJoinColumns = { @JoinColumn(name = "ATTACHMENT_ID") })
private Set<Attachment> attachments = new HashSet<>();


@Temporal(TemporalType.DATE)
@JsonSerialize(using = CustomJsonDateSerializer.class)
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
@Column(name = "BEGIN_DATE")
private Date beginDate;

@Temporal(TemporalType.DATE)
@JsonSerialize(using = CustomJsonDateSerializer.class)
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
@Column(name = "END_DATE")
private Date endDate;}

而我的ActivityDTO

@Getter
@Setter
public class ActivityDTO {
private Long id;
private Set<Attachment> attachments = new HashSet<>();

@Temporal(TemporalType.DATE)
@JsonSerialize(using = CustomJsonDateSerializer.class)
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
private Date beginDate;

@Temporal(TemporalType.DATE)
@JsonSerialize(using = CustomJsonDateSerializer.class)
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
private Date endDate;

这是我的ActivityController类。

    public Activity save(ActivityDTO activityDTO, List<MultipartFile> fileList) throws Exception {
    Activity activity = convertActivityDTOtoEntity(activityDTO);
    activity.getAttachments().addAll(ObjectFactory.createAttachment(fileList, Activity.class));
    return activityRepository.save(activity);
}

public Activity update(ActivityDTO activityDTO, List<MultipartFile> fileList) throws Exception {
    Activity activity = convertActivityDTOtoEntity(activityDTO);
    activity.getAttachments().addAll(ObjectFactory.createAttachment(fileList, Activity.class));
    return activityRepository.save(activity);
}
    private Activity convertActivityDTOtoEntity(ActivityDTO activityDTO) {
    return modelMapper.map(activityDTO, Activity.class);
}

另外,我还有一个问题,我刚刚把我的实体使用转换为DTO对象,直到现在服务是直接到达实体,并且在更新时,如果我删除任何附件或添加,都没有问题。当我把实体转换为DTO对象并像上面一样使用后,更新时出现了问题。

传递给持久化的分离实体:com.thy.agencycrm.entity.Attachment。

这里是我的Attachment实体,如果你想看看。

 @Getter
@Setter
@Entity
public class Attachment implements Serializable {


@Id
@Column(name = "ID")
@GeneratedValue
@SequenceGenerator
private Long id;

@Column(name = "MIME_TYPE")
private String mimeType;

请帮助我关于这个问题,我正在寻找和试图解决它很长一段时间。

先谢谢你。

spring hibernate dto mapper modelmapper
1个回答
2
投票

我想你只是把字段复制到你的转换器中的一个新对象中,对吗?默认的JPA只更新实体,如果它在持久化上下文中,并且两个对象是相同的。如果你有一个分离的对象,在转换器中创建一个新的对象,它将被保存为新记录。你是否设置了ID并不重要,因为ID是由序列生成的,就像你在实体类上注释的那样。你可以用很多方法解决这个问题。最简单的方法是通过id加载实体,然后将另一个对象的字段设置到这个管理对象中。


0
投票

更新了你的类ActivityController

public Activity save(ActivityDTO activityDTO, List<MultipartFile> fileList) throws Exception {
    Activity activity = convertActivityDTOtoEntity(activityDTO);
    activity.getAttachments().addAll(ObjectFactory.createAttachment(fileList, Activity.class));
    return activityRepository.save(activity);
}

public Activity update(ActivityDTO activityDTO, List<MultipartFile> fileList) throws Exception {
    Activity activity = activitiyRepository.findOne(activityDTO.getID());

    // This will update the existing activity with activityDTO
    modelMapper.map(activityDTO, activity);

    activity.getAttachments().addAll(ObjectFactory.createAttachment(fileList, Activity.class));
    return activityRepository.save(activity);
}
    private Activity convertActivityDTOtoEntity(ActivityDTO activityDTO) {
    return modelMapper.map(activityDTO, Activity.class);
}
© www.soinside.com 2019 - 2024. All rights reserved.