복붙노트

[SPRING] 하위 데이터를 저장할 때 지속되도록 분리 된 엔터티 전달

SPRING

하위 데이터를 저장할 때 지속되도록 분리 된 엔터티 전달

양식을 제출할 때이 오류가 표시됩니다.

내 엔티티는 다음과 같습니다.

계정:

@Entity
@DynamicInsert
@DynamicUpdate
public class Account {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String login;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String email;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
    private List<Team> ownedTeams;

    ...

팀:

@Entity
@DynamicInsert
@DynamicUpdate
public class Team {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String name;

    @ManyToOne
    @JoinColumn(name = "owner_id", nullable = false)
    private Account owner;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "team")
    private List<Account> members;

    ...

컨트롤러의 일부입니다.

    @ModelAttribute("team")
    public Team createTeamObject() {
        return new Team();
    }

    @RequestMapping(value = "/teams/create-team", method = RequestMethod.GET)
    public String getCreateTeam(@ModelAttribute("team") Team team, Principal principal) {
        logger.info("Welcome to the create team page!");

        Account owner = accountService.findOneByLogin(principal.getName());
        team.setOwner(owner);
        team.setMembers(new AutoPopulatingList<Account>(Account.class));

        return "teams";
    }

    @RequestMapping(value = "/teams/create-team", method = RequestMethod.POST)
    public String postCreateTeam(@ModelAttribute("team") Team team) {
        logger.info("Team created!");

        teamService.save(team);

        return "redirect:/teams.html";
    }

그리고 형식 :

<form:form commandName="team" id="teamForm">
      <div class="form-group">
          <label>Name</label>
          <form:input path="name" cssClass="form-control" />
      </div>
      <div class="form-group" id="row-template">
          <label>Members</label>
          <form:select path="members[0].id" cssClass="form-control" data-live-search="true" >
             <form:options items="${accounts}" itemValue="id" />
          </form:select>
          ...
      </div>
   <form:hidden path="owner.id" />
</form:form>

내가 뭘 잘못하고 있죠?

해결법

  1. ==============================

    1.

    teamService.save(team);
    

    Save 메서드는 일시적인 개체 만 허용합니다. 여기서 찾을 수있는 일시적인 객체는 무엇입니까?

    Transient - new 연산자를 사용하여 방금 인스턴스화 된 경우 객체가 일시적이며 최대 절전 모드 세션과 연관되지 않습니다. 데이터베이스에 지속적인 표현이없고 식별자 값이 지정되지 않았습니다. 응용 프로그램이 더 이상 참조를 보유하지 않으면 일시적인 인스턴스가 가비지 수집기에 의해 파괴됩니다. Hibernate Session을 사용하여 객체를 영속화시킨다 (그리고 Hibernate가이 변환을 위해 실행되어야하는 SQL 문을 처리하게한다).

    Team 객체를 가져오고 DB에 저장하려고 시도했지만 해당 객체에 Account 객체가 있고 해당 Account 객체가 분리되어 있습니다 (해당 객체의 인스턴스가 DB에 저장되었지만 해당 객체가 세션에 없다는 것을 의미 함). ). Hibernate가 당신을 지정했기 때문에 그것을 저장하려고 시도하고있다 :

    @OneToMany(cascade = CascadeType.ALL, ....
    

    따라서 문제를 해결할 수있는 방법은 거의 없습니다.

    1) CascadeType.ALL 구성을 사용하지 마십시오. 계정 개체는 팀 수 (최소한 도메인 구조 허용)로 사용할 수 있으며 업데이트 작업으로 모든 팀의 계정을 업데이트 할 수 있습니다. 즉,이 작업을 팀 업데이트로 시작해서는 안됩니다. 나는 당신이 정말로 MERGE / DELETE 설정을 사용해야한다면, 거기에서 캐스케이드 매개 변수를 제거 할 것이다. (기본값은 캐스케이드 연산이 아니다). 그러나 당신이 정말로 그것을 지속 할 필요가 있다면, 옵션 # 2를보십시오.

    2) 'save ()'대신 'saveOrUpdate ()'메소드를 사용하십시오. 'saveOrUpdate ()'메소드는 일시적인 오브젝트와 분리 된 오브젝트를 허용합니다. 그러나이 접근법의 문제점은 디자인에 있습니다. 팀 오브젝트를 저장할 때 정말로 계정을 삽입 / 업데이트해야합니까? 두 가지 작업으로 나누어 Team에서 Account를 업데이트하지 못하게 할 것입니다.

    희망이 도움이됩니다.

  2. ==============================

    2.ID가 설정되어 있기 때문에 오류가 발생합니다. Hibernate는 일시적인 객체와 분리 된 객체를 구분하고 persist는 일시적인 객체에서만 작동합니다.

    ID가 설정되어 있기 때문에 오류가 발생합니다. Hibernate는 일시적인 객체와 분리 된 객체를 구분하고 persist는 일시적인 객체에서만 작동합니다.

    isteamService.save(team);
    

    @GeneratedValue 때문에이 작업에서 ID를로드 할 수 없습니다.

  3. ==============================

    3.ID는 자동 생성 된 값이므로 클라이언트 쪽에서 보내지 마십시오. 나는 같은 문제가 있었다. 자동 생성 속성 값을 제공하지 않았는지 확인하십시오.

    ID는 자동 생성 된 값이므로 클라이언트 쪽에서 보내지 마십시오. 나는 같은 문제가 있었다. 자동 생성 속성 값을 제공하지 않았는지 확인하십시오.

  4. from https://stackoverflow.com/questions/27672337/detached-entity-passed-to-persist-when-save-the-child-data by cc-by-sa and MIT license