문제

나는 최대 절전 모드를 JPA 제공 업체로 사용하고 있으며 전화 번호 테이블에 외국 키를 저장하기 위해 @onetomany (많은 음소를 가진 연락처)를 얻으려고 노력하고 있습니다. 내 양식에서 전화 (번호) 목록이있는 연락처 객체가 나타납니다. 접점이 제대로 지속됩니다 (최대 절전 모드는 지정된 시퀀스에서 PK를 가져옵니다). 전화 (번호) 목록은 올바른 PK로 지속되지만 연락처 테이블에는 FK가 없습니다.

public class Contact implements Serializable {

    @OneToMany(mappedBy = "contactId", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    private List<Phone> phoneList;

}

public class Phone implements Serializable {

    @JoinColumn(name = "contact_id", referencedColumnName = "contact_id")
    @ManyToOne
    private Contact contactId;

}

@Repository("contactDao")
@Transactional(readOnly = true)
public class ContactDaoImpl implements ContactDao {

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void save(Contact c) {
        em.persist(c);
        em.flush();
    }
}


@Controller
public class ContactController {
    @RequestMapping(value = "/contact/new", method = RequestMethod.POST)
    public ModelAndView newContact(Contact c) {
        ModelAndView mv = new ModelAndView("contactForm");
        contactDao.save(c);
        mv.addObject("contact", c);
        return mv;
    }
}

바라건대 위의 모든 관련 비트를 모두 얻었 으면 좋겠습니다. 그렇지 않으면 알려주세요.

도움이 되었습니까?

해결책

자바 관계를 직접 관리해야합니다. 이런 종류의 경우 다음과 같은 것이 필요합니다.

@Entity
public class Contact {
  @Id
  private Long id;

  @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "contact")
  private List<Phone> phoneNumbers;

  public void addPhone(PhoneNumber phone) {
     if (phone != null) {
        if (phoneNumbers == null) {
            phoneNumbers = new ArrayList<Phone>();          
        }
        phoneNumbers.add(phone);
        phone.setContact(this);
     }
  }

  ...
}

@Entity
public class Phone {
  @Id
  private Long id;

  @ManyToOne
  private Contact contact;

  ...
}

다른 팁

Cletus의 답변에 대한 답변. 나는 @column ID 필드 및 모든 시퀀스에 주석. MAPPEDBY 매개 변수를 사용하는 대안 @OneToMany 주석은 사용하는 것입니다 @JoinColumn 주석.

Addphone 요구 사항의 구현을 제외하고는 제외하고. 아마도 같은 것일 것입니다.

public void addPhone(PhoneNumber phone) {
    if (phone == null) {
        return;
    } else {
        if (phoneNumbers == null) {
            phoneNumbers = new ArrayList<Phone>();
        }
        phoneNumbers.add(phone);
        phone.setContact(this);
    }
}

연락처 관계가 단방향 인 경우 교체 할 수도 있습니다. mappedBy 안에 @OneToMany 주석 @JoinColumn(name = "contact_id").

@Entity
public class Contact {
  @Id
  private Long id;

  @OneToMany(cascade = CascadeType.PERSIST)
  @JoinColumn(name = "contact_id")
  private List<Phone> phoneNumbers;

  // normal getter/setter
  ...
}

@Entity
public class PhoneNumber {
  @Id
  private Long id;

  ...
}

비슷합니다 jpa @onetomany-> 부모 - 아동 참조 (외국 키)

나는 생각하지 않는다 추가폰 방법이 필요합니다. 전화 객체에서 연락처 만 설정하면됩니다.

phone.setContact(contact);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top