gpt4 book ai didi

java - 分离的实体传递到持久化 : one to one to relationship

转载 作者:行者123 更新时间:2023-12-02 12:04:22 26 4
gpt4 key购买 nike

我有一个像这样的实体调查:

@Entity
public class SurveyData {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "SURVEY_ID")
private Long Id;

@ManyToOne
@JsonBackReference
@JoinColumn(name = "client_id")
public Client client;

@OneToOne
@JsonManagedReference
@JoinColumn(name = "surveyresult_id")
private SurveyDataResults surveyDataResults;

private Character unit;
..and other fields

另一个实体 SurveyDataResults 如下所示:

 @Entity
@Table(name = "surveydataresults")
public class SurveyDataResults {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "SURVEYRESULT_ID")
private Long Id;
..and other fields

SurveyData 从 POST 表单中填写,保存后,使用这些字段进行一些计算,然后保存在 SurveyDataResult 中。当我第一次提交表单时,它会保存在 SurveyData 上,并包含对第一个 SurveyDataResults 的引用,其中 id 为 1,其中包含所有结果。当我第二次使用值填写表单时,出现错误:分离的实体传递给持久:SurveyDataResults

我看到的问题是,如果我依次填写表单,提交的第二个表单的结果将保存在 ID=1 的 SurveyDataResults 中。因此分离实体问题,因为它已经保存过一次。如何在每次提交表单后都进行相应的映射?

编辑:

我的帖子 Controller :

@RequestMapping(value = "/user/calculate", method = RequestMethod.POST)
public ModelAndView createNewSurvey(@Valid SurveyData survey_data, BindingResult bindingResult) {

long clientId = survey_data.client.getId();
SurveyData newSurvey = surveyService.saveSurvey(survey_data);
Long surveyId = newSurvey.getId();
calculateService.CalculateFirst(surveyId);
calculateService.CalculateSecond(surveyId);
calculateService.CalculateThird(surveyId);
=
return new ModelAndView("redirect:/user/surveys?getId=" + clientId);
}

在calculateService中,我使用.save保存每个字段,如下所示:SurveyServiceResults.saveSurveyResults(surveyresults);

 @Service("calculateService")
public class CalculateServiceImpl implements CalculateService {
@Autowired
private SurveyDataRepository surveyDataRepository;
SurveyDataResults surveyresults = new SurveyDataResults();
@Autowired
private SurveyServiceResults surveyServiceResults;

public void CalculateFirst(Long id){
SurveyData survey = surveyDataRepository.findOne(id);
Integer c=survey.getA()+survey.getB();
surveyResults.setC(c);
surveyServiceResults.saveSurveyResults(surveyresults);
}
public void CalculateSecond(Long id){
SurveyData survey = surveyDataRepository.findOne(id);
Integer D=survey.getB()+survey.getM();
surveyResults.setD(D);
surveyServiceResults.saveSurveyResults(surveyresults);
}

服务:

public interface SurveyServiceResults {

public void saveSurveyResults(SurveyDataResults surveyresults);

}

实现:

@Service("surveyServiceResults")

公共(public)类 SurveyServiceResultsImpl 实现 SurveyServiceResults {

@Autowired
private SurveyDataResultsRepository surveyDataResultsRepository;

@Override
public void saveSurveyResults(SurveyDataResults surveyresults) {
surveyDataResultsRepository.save(surveyresults);
}
}

存储库:

@Repository("surveyDataResults")
public interface SurveyDataResultsRepository extends
JpaRepository<SurveyDataResults, Long>{}

这是我得到的错误:

detached entity passed to persist: com.test.test1.model.SurveyDataResults; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.test.test1.model.SurveyDataResults

最佳答案

错误肯定出现在 CalculateServiceImpl 类中,您将 surveryresults 声明为类成员字段。在服务和存储库等类中这样做是错误的,您应该尽量不要在此类中保存状态信息。一旦服务实例化(从 Spring),此 surveyresults 在所有对 CalculateXXX 的调用中都是相同的,这就是您收到分离实体错误的原因。

SurveyDataResults surveyresults = new SurveyDataResults();

因此,从那里删除这一行,然后从 CalculateXXX 方法内部加载并使用 SurveyDataResults

示例如下,但我不知道它是否会按预期工作,因为您尚未发布所有代码(例如,请参阅我的内联评论)

public void CalculateFirst(Long id){
SurveyData survey = surveyDataRepository.findOne(id);
Integer c=survey.getA()+survey.getB();
SurveyDataResults surveyResults = survey.getSurveyresults();
if (surveyResults == null) {
surveyResults = new SurveyDataResults();
surveyResults.setSurvey(survey); //not present in your code but I assume it exists
}
surveyResults.setC(c);
surveyServiceResults.saveSurveyResults(surveyresults);
}

更新

另一点是通过 SurveyDataResultsRepository 保存调查结果的方式。如果您没有像上面的代码示例中那样通过 SurveyDataResults 中的 setter 方法设置 survey,则您与 SurveyData调查数据结果。如果 SurveyDataResults 实体内没有 SurveyData 字段,则应将 SurveyDataResults 设置为 SurveyData并通过调用 SurveyDataRepository.save 而不是通过 SurveyDataResultsRepository 来保存 SurveyData

例如

public void CalculateFirst(Long id){
SurveyData survey = surveyDataRepository.findOne(id);
Integer c=survey.getA()+survey.getB();
SurveyDataResults surveyResults = survey.getSurveyresults();
if (surveyResults == null) {
surveyResults = new SurveyDataResults();
survey.setSurveyDataResults(surveyResults);
}
surveyResults.setC(c);
surveyDataRepository.save(survey);
}

关于java - 分离的实体传递到持久化 : one to one to relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47010335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com