質問

SpringとHibernateをJPAプロバイダーとして使用していて、@ OneToMany(多くの電話番号を持つ連絡先)を取得して、電話番号テーブルに外部キーを保存しようとしています。私のフォームから、Phone(numbers)のリストを持つContactオブジェクトを取得します。 Contactは適切に永続化されます(Hibernateは指定されたシーケンスからPKを取得します)。 Phone(numbers)のリストも正しいPKで保持されますが、Contactsテーブルには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;
    }
}

うまくいけば、上記の関連ビットをすべて入手できました。それ以外の場合はお知らせください。

役に立ちましたか?

解決

自分でJavaの関係を管理する必要があります。この種のものには、次のようなものが必要です:

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

  ...
}

他のヒント

クレタスの回答への回答。 idフィールドとすべてのシーケンスに @column アノテーションを付けることが重要だと思います。 @OneToMany アノテーションのmappedByパラメーターを使用する代わりに、 @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);
    }
}

連絡先と電話の関係が単方向の場合、 @OneToMany 注釈の mappedBy @JoinColumn(name =&quot; contact_id&quot;)

@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-&gt;親-子参照(外部キー)

addPhone メソッドは必要ないと思います。電話オブジェクトで連絡先を設定するだけです:

phone.setContact(contact);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top