JPA لا إنقاذ الخارجية مفتاح @OneToMany العلاقة

StackOverflow https://stackoverflow.com/questions/814474

  •  03-07-2019
  •  | 
  •  

سؤال

أنا باستخدام الربيع مع السبات كما 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;

  ...
}

نصائح أخرى

في الرد على الجواب كليتوس. وأود أن أقول أنه من المهم أن يكون هذا الشرح @column في مجالات الهوية، فضلا عن تسلسل الاشياء. كبديل لاستخدام المعلمة 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;

  ...
}

JPAOneToMany -> الوالد - المرجع الطفل (مفتاح الخارجية)

أنا لا أعتقد addPhone الطريقة ضروري لديك فقط لضبط الاتصال في الهاتف وجوه:

phone.setContact(contact);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top