2009-05-02 11 views
14

私はJPAプロバイダとしてHibernateと共にSpringを使用しており、電話番号テーブルに外部キーを保存する@OneToMany(多数の電話番号を持つ連絡先)を取得しようとしています。私のフォームから私はそれに電話番号のリストを持っている連絡先オブジェクトを取得します。 Contactは適切に永続化されます(Hibernateは指定されたシーケンスからPKをフェッチします)。 Phone(番号)のリストも正しいPKで永続化されますが、連絡先テーブルにはFKはありません。JPOは@OneToMany関係に外部キーを保存しません

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

上記の関連するビットをすべて取得したらうまくいけば、私に知らせてください。

答えて

21

自分で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 PhoneNumber { 
    @Id 
    private Long id; 

    @ManyToOne 
    private Contact contact; 

    ... 
} 
+0

おかげで同様の

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

は、それを解決しました。 –

+5

'addPhone'メソッドは正しいですか?ヌルチェックが間違った場所にあるように見えます。 –

+0

phone.setContact(this) - これはメモリリークですか?か否か? –

6

答えはCletusの答えです。 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); 
    } 
} 
1

私はaddPhoneメソッドは必要ではないと思います。あなたは電話オブジェクトの連絡先を設定するだけです:phone.setContact(contact);

関連する問題