JPAでのManyToOneとOneToManyの双方向設定


重要なのは、次の言葉を覚えておくことです.
複数の一方は関係メンテナンス側であり、関係メンテナンス側は外部キー記録の更新を担当し、関係被メンテナンス側は外部キー記録を更新する権利がない.
注意:(身をもって経験します~~)私は気を失って、长い间の间违いを探して、自分の図が便利で@Tableで表示していないことを発见して、结果は表の表名を生成して対応する类名で、ちょうどMySQLのキーワードグループで、后でやはり@Tableの表示をプラスしたほうがよくて、しかも表名は“t_”はじめに.
 
リレーショナル・メンテナンス・エンド(複数の側)
package contactbook.domain;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="t_contacts")
public class Contact implements Serializable{

	private static final long serialVersionUID = 5630087178466798365L;
	private Integer id;
	private String name;
	private String phone;
	private String email;
	private String address;
	private Group group;
	
	public Contact() {
		super();
	}
	public Contact(String name, String phone, String email, String address) {
		super();
		this.name = name;
		this.phone = phone;
		this.email = email;
		this.address = address;
	}
	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
	@JoinColumn(name="groupid")
	public Group getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
	@Override
	public String toString() {
		return "name:"+name+",phone:"+phone+",email:"+email+",address:"+address;
	}
}
 
関係が維持される側(一方)
package contactbook.domain;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="t_groups")
public class Group implements java.io.Serializable{

	private static final long serialVersionUID = -6948198014545065959L;
	
	private Integer id;
	private String name;
	private Set<Contact> contacts = new HashSet<Contact>();
	
	public Group() {
		super();
	}
	public Group(String name) {
		super();
		this.name = name;
	}
	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@OneToMany(mappedBy="group",cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH},
	fetch=FetchType.EAGER)
	public Set<Contact> getContacts() {
		return contacts;
	}
	public void setContacts(Set<Contact> contacts) {
		this.contacts = contacts;
	}
	
	//    
	public void addContacts(Contact contact){
		contact.setGroup(this);//            ,     
		this.contacts.add(contact);
	}
	@Override
	public String toString() {
		return "id:"+id+",name:"+name;
	}
	
}

テスト:
package contactbook.test;

import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import contactbook.domain.Contact;
import contactbook.domain.Group;
import contactbook.service.GroupService;

public class TestGroup {
	private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	private GroupService groupService = (GroupService) ac.getBean("groupService");
	
	@Test
	public void testSave(){
		Group g = new Group("  ");
		Contact c1 = new Contact("  ","13729767419","[email protected]","  ");
		Contact c2 = new Contact("  ","13753449488","[email protected]","  ");
		g.addContacts(c1);
		g.addContacts(c2);
		groupService.save(g);
	}
	
	@Test
	public void testFindAll(){
		List<Group> gList = groupService.findAll();
		System.out.println(gList);
		for(Group g:gList){
			System.out.println("id:"+g.getId()+","+g.getContacts());
		}
	}
}
アプリケーションContextは省略する.xmlコードとsrc/META-INF/persistence.xmlとdaoとserviceコード.