java - hibernate , Spring 。同一实体的多个表示正在合并

标签 java hibernate jpa

我在尝试更新实体列表(作业)时遇到错误:

Multiple representations of the same entity [com.introlabsystems.upworkscraper.model.entities.Skill#42] are being merged. Detached: [Skill(id=42, skillName=Web Scraping)]; Detached: [Skill(id=42, skillName=Web Scraping)]

我认为这是在三个实体与 Skill 实体具有多对多关系的情况下。

@Entity
public class Job {

  @Id
  @Column(unique = true, nullable = false)
  @SerializedName(value = "ciphertext")
  private String id;
  @Column(length = 2048)
  private String title;
  @Column(columnDefinition = "TEXT")
  @JsonAdapter(value = DescriptionAdapter.class)
  private String description;
  @SerializedName(value = "subcategory2")
  private String category;

  @ManyToMany(cascade = {
      CascadeType.MERGE
  }, fetch = FetchType.EAGER)
  @JoinTable(
      joinColumns = {@JoinColumn(name = "job_id")},
      inverseJoinColumns = {@JoinColumn(name = "skill_id")}
  )
  @JsonAdapter(value = SkillsAdapter.class)
  private Set<Skill> skills;

  private String duration;
  private String engagement;
  @JsonAdapter(value = AmountAdapter.class)
  private String amount;
  @JsonAdapter(value = AmountAdapter.class)
  private String maxAmount;

  private String freelancersToHire;
  private String enterpriseJob;
  private String proposalsTier;
  private String stickyLabel;
  @SerializedName(value = "tierLabel")
  private String tier;

  @JsonAdapter(value = DateTimeAdapter.class)
  private LocalDateTime createdOn;
  @JsonAdapter(value = DateTimeAdapter.class)
  private LocalDateTime publishedOn;
  @JsonAdapter(value = DateTimeAdapter.class)
  private LocalDateTime renewedOn;
  private LocalDateTime hiredOn;

  @OneToOne(cascade = CascadeType.ALL)
  private Contract contract;

  @SerializedName(value = "type")
  @JsonAdapter(value = JobTypeAdapter.class)
  @Enumerated(value = EnumType.STRING)
  private JobType jobType;

  @Enumerated(value = EnumType.STRING)
  private JobStatus jobStatus = JobStatus.OPEN;

  private String projectStage;
  private String ongoingProject;
  private String projectType;
  private String finalOutput;
  private String Platform;
  private String oneTimeProject;
  private String jobSuccessScore;
  private String includeRisingTalent;
  private String englishLevel;
  private String upworkHours;
  private String freelancerType;
  private String preferredLocation;
  private String interviewing;

  @OneToOne(cascade = CascadeType.ALL)
  private PrivateStatus privateStatus;
}

@Data
@Entity
public class Skill {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;
  private String skillName;
}

@Data
@Entity
public class Contract {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @JsonAdapter(value = ContractJobIdAdapter.class)
  @SerializedName(value = "jobInfo")
  private String jobId;

  private String totalCharge;
  private String totalHours;

  @JsonAdapter(value = AmountAdapter.class)
  private String rate;

  @JsonAdapter(value = DateTimeAdapter.class)
  private LocalDateTime startDate;
  @JsonAdapter(value = DateTimeAdapter.class)
  private LocalDateTime endDate;

  @ManyToOne(cascade = CascadeType.MERGE)
  @SerializedName(value = "contractorInfo")
  private Freelancer freelancer;

  @ManyToOne(cascade = CascadeType.ALL)
  private Client client;
}

@Data
@Entity
public class Freelancer {

  @Id
  @SerializedName(value = "ciphertext")
  private String id;
  @SerializedName(value = "contractorName")
  private String name;
  @Column(length = 2048)
  private String title;
  @Column(columnDefinition = "TEXT")
  @JsonAdapter(value = DescriptionAdapter.class)
  private String description;
  @JsonAdapter(value = FreelancerLocationAdapter.class)
  private String location;

  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(
      joinColumns = {@JoinColumn(name = "freelancer_id")},
      inverseJoinColumns = {@JoinColumn(name = "skill_id")}
  )
  @JsonAdapter(value = SkillsAdapter.class)
  private Set<Skill> skills;

  private String hourlyRate;
  private String privateFeedbackHireAgain;
  private String rating;
  private String scores;
  private String totalEarnings;
  private String totalFeedback;
  private String totalFixedJobs;
  private String totalHourlyJobs;
  private String totalHours;
  private String totalJobsWorked;
  private String topRatedStatus;
  private String successScore;

  @OneToMany(cascade = CascadeType.ALL)
  private List<ContractHistory> contractHistories;

  @ManyToMany(cascade = {
      CascadeType.PERSIST,
      CascadeType.MERGE
  })
  @JoinTable(
      joinColumns = {@JoinColumn(name = "freelancer_id")},
      inverseJoinColumns = {@JoinColumn(name = "agency_id")}
  )
  private Set<Agency> agency;
}


@Data
@Entity
public class Agency {

  @Id
  @SerializedName(value = "chipertext")
  private String id;

  @JsonAdapter(value = AmountAdapter.class)
  private String minRate;
  @JsonAdapter(value = AmountAdapter.class)
  private String maxRate;
  private String city;
  private String country;
  @Column(columnDefinition = "TEXT")
  @JsonAdapter(value = DescriptionAdapter.class)
  private String description;
  private String jobSuccessScore;
  private String name;
  @Column(length = 2048)
  private String title;
  private String topRatedStatus;
  private String totalEarnings;
  private String totalHours;
  private String totalJobs;
  private String recentEarnings;
  private String averageRecentEarnings;
  @JsonAdapter(value = DateTimeAdapter.class)
  private LocalDateTime memberSince;

  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(
      joinColumns = {@JoinColumn(name = "agency_id")},
      inverseJoinColumns = {@JoinColumn(name = "skill_id")}
  )
  @JsonAdapter(value = SkillsAdapter.class)
  private Set<Skill> skills;
}

我想保住工作。在此之前,我从工作、代理机构、自由职业者那里获得技能,尝试在数据库中搜索它们并替换 ID。

    for (Skill skill: skills) 
    {
        Skill skillWithID = 
        skillDataService.findBySkillName(skill.getSkillName())
          .orElseGet(() -> skillDataService.save(skill));
        skill.setId(skillWithID.getId());
    }

最佳答案

已更改

CascadeType.MERGE

CascadeType.PERSIST,
CascadeType.DETACH,
CascadeType.REFRESH,
CascadeType.REMOVE

它有效

关于java - hibernate , Spring 。同一实体的多个表示正在合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52555535/

相关文章:

java - 如何在多线程场景中使用自行生成的_id更新插入mongodb文档/记录

java - 使用 Apache Commons Configuration 将用户输入的路径传递到 .properties 文件中

java - 检测光标附近区域内的颜色

java - 使用 getCharacterStream API 读取 Clob 对象导致 "java.sql.SQLException: could not reset reader"

java - JPA 实体是否应该为 hashcode() 实现返回一个常量?

java - 使用扫描器类在 Java 中读取字符串输入的问题

java - Hibernate 多对一更新外键为空

java - 异常设计与应用需求不匹配

java - 多个持久性单元出现未知实体异常

java - JPA 抛出 - "ERROR: user lacks privilege or object not found: BOOK"