2017-10-30 10 views
0

に私はこのようなエンティティの調査があります。このようなSurveyDataResults外しエンティティ:一から一関係

@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 

、別のエンティティ:

@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です。 2回目のフォームに値を記入すると、エラーが発生します。分離されたエンティティがpersistに渡されました:SurveyDataResults

私が見ている問題は、次々にフォームに記入すると、提出された2番目のフォームはID = 1のSurveyDataResultsに保存されます。したがって、すでに1回保存されているため、分離されたエンティティが発行されます。 それに応じて、すべてのフォーム提出後にマッピングを作成するにはどうすればよいですか?

EDIT:

マイポストコントローラー:

@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); 
} 

そして、私はこのように.SAVE使用してすべてのフィールドを保存calculateService中: 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") 

パブリッククラス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 
+0

私はコードで説明していますか? – pleft

+0

私は投稿を編集しました。ありがとうございました – MonnIca

+0

'surveyService.saveSurvey'メソッドと' calculateService.CalculateFirst'、 'calculateService.CalculateSecond'、' calculateService.CalculateThird'メソッドも投稿してください。できるだけ多くの情報を提供してください。また、 'detached entities passed to persist:SurveyDataResults'だけでなく、完全なエラースタックトレースを投稿するのを忘れないでください。 – pleft

答えて

0

エラーは、クラスのメンバフィールドとしてsurveryresultsを宣言CalculateServiceImplクラス、中に確かにあります。これはサービスやリポジトリのようなクラスでは間違っているので、そのようなクラスではstateの情報を保持しないようにしてください。このsurveyresultsサービスが(Springから)インスタンス化されると、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); 
} 

UPDATE

もう一つのポイントは、SurveyDataResultsRepositoryを経由してsurveyResultsを保存する方法です。上記のコード例のようにをSurveyDataResultsのセッターメソッドで設定しないと、SurveyDataSurveyDataResultsの関係はありません。 SurveyDataResultsエンティティ内にSurveyDataフィールドがない場合はSurveyDataResultsSurveyDataに設定し、SurveyDataResultsRepositoryではなくSurveyDataRepository.saveを呼び出して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); 
} 
+0

あなたは人生の節約者です!大変ありがとう! – MonnIca

関連する問題