JPA中配置ManyToOne和OneToMany的双向
关键要记住下面一句话:
多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录。
注意:(亲身经历哦~~)
我晕,找了好久的错误,发现是自己图方便没有用@Table标注,结果生成表的表名为对应的类名,刚好
是MySQL的关键字group,以后还是最好加上@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@GeneratedValuepublic 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;}@Overridepublic 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@GeneratedValuepublic 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);}@Overridepublic 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");@Testpublic void testSave(){Group g = new Group("同学");Contact c1 = new Contact("小红","13729767419","xiaohong@163.com","江西");Contact c2 = new Contact("刘俊","13753449488","lj1987@163.com","昆明");g.addContacts(c1);g.addContacts(c2);groupService.save(g);}@Testpublic void testFindAll(){List<Group> gList = groupService.findAll();System.out.println(gList);for(Group g:gList){System.out.println("id:"+g.getId()+","+g.getContacts());}}}? 省略了applicationContext.xml代码,和src/META-INF/persistence.xml和dao和service代码。