Frage

Ich bin mit Spring mit Hibernate als JPA-Provider und versuche, eine @OneToMany zu bekommen (ein Kontakt viele Telefonnummern mit), um die Fremdschlüssel in den Telefonnummern-Tabelle zu speichern. Aus meiner Form erhalte ich ein Kontaktobjekt, das eine Liste von Telefon (Zahlen) in ihm. Der Kontakt get beharrte richtig (Hibernate holt einen PK aus der angegebenen Reihenfolge). Die Liste des Telefons (Zahlen) wird auch mit einer richtigen PK beharrt, aber es gibt keine FK in die Kontakttabelle.

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

Hoffentlich habe ich alle relevanten Bits oben, sonst lass es mich wissen.

War es hilfreich?

Lösung

Sie müssen die Java-Beziehungen selbst verwalten. Für diese Art der Sache müssen Sie so etwas wie:

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

  ...
}

Andere Tipps

In Antwort auf Cletus' Antwort. Ich würde sagen, es ist wichtig, die @column Anmerkung auf die ID-Felder zu haben, sowie alle die Sequenz Zeug. Alternativ kann die Parameter der mappedBy @OneToMany Annotation zu verwenden ist, um die @JoinColumn Annotation zu verwenden.

Wie ein bisschen beiseite Ihre Implementierung von addphone auf Bedürfnisse suchen. Es sollte wohl so etwas wie.

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

Wenn die Kontakt-Telefon Beziehung unidirektional ist, können Sie auch mappedBy in @OneToMany Annotation mit @JoinColumn(name = "contact_id") ersetzen.

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

  ...
}

Ähnlich wie in JPA @OneToMany -> Eltern - Kind Referenz (Foreign Key)

Ich glaube nicht, das addphone Methode ist erforderlich, können Sie nur den Kontakt im Telefon Objekt einstellen:

phone.setContact(contact);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top