tags:

views:

2298

answers:

2

I'm using Spring with Hibernate as a JPA provider and are trying to get a @OneToMany (a contact having many phonenumbers) to save the foreign key in the phone numbers table. From my form i get a Contact object that have a list of Phone(numbers) in it. The Contact get persisted properly (Hibernate fetches an PK from the specified sequence). The list of Phone(numbers) also gets persisted with a correct PK, but there's no FK to the Contacts table.

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

Hopefully I got all of the relevant bits above, otherwise please let me know.

+1  A: 

You have to manage the Java relationships yourself. For this kind of thing you need something like:

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

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

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

  ...
}

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

  @ManyToOne
  private Contact contact;

  ...
}
cletus
Thanks, setting the java relationships solved it.
NA
+1  A: 

In reply to Cletus' answer. I would say that it's important to have the @column annotation on the id fields, as well as all the sequence stuff. An alternative yo using the mappedBy parameter of the @OneToMany annotation is to use the @JoinColumn annotation.

As a kinda aside your implementation of addPhone needs looking at. It should probably be something like.

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