双向的时候必须制定MappedBy这个属性!防止数据库生成的冗余。
MappedBy属性是设置在多的一方,即在数据库中,一般都是将属性设置在多的一方。
如果没有,那么在生成数据库表的时候,就会有两个外键如图:
onetomany的例子如下
加入MappedBy这个属性的 例子:
1 package com.hb.model; 2 3 import java.util.Collection; 4 import java.util.HashSet; 5 import java.util.Iterator; 6 import java.util.Set; 7 8 import javax.persistence.Entity; 9 import javax.persistence.GeneratedValue; 10 import javax.persistence.Id; 11 import javax.persistence.JoinColumn; 12 import javax.persistence.OneToMany; 13 import javax.persistence.Table; 14 15 @Entity 16 @Table(name="t_group")//group是关键字,不重新命名就没有表生成 17 public class Group { 18 private int id ; 19 private String name ; 20 private Set<User> users = new HashSet<User>(); 21 22 @Id 23 @GeneratedValue 24 public int getId() { 25 return id; 26 } 27 28 //group是user类的属性名 29 30 //因为是一 到 多的那边,所以设置的东西会出现在多的那方,这样理解 31 //为什么是OneToMany 32 //group 是一的一方,所以就是一对多(OneToMany) 33 @OneToMany(mappedBy="bgroup") 34 // @JoinColumn(name="groupId") //记住,永远会加在多的一方 35 //如果加上@JoinColumn(name="groupId"),则会在user表出现这个列,是自动生成的别名 36 public Set<User> getUsers() { 37 return users; 38 } 39 40 41 public void setId(int id) { 42 this.id = id; 43 } 44 public String getName() { 45 return name; 46 } 47 public void setName(String name) { 48 this.name = name; 49 } 50 public void setUsers(Set<User> users) { 51 this.users = users; 52 } 53 54 }
1 @Entity 2 @Table(name="t_user") 3 public class User { 4 private int id ; 5 private String name ; 6 private Group bgroup; 7 8 //数据库表中,关联关系设置在多的一方 9 //为什么是ManyToOne 10 //user 是多的一方,所以就是多对一(ManyToOne) 11 @ManyToOne 12 public Group getBgroup() { 13 return bgroup; 14 } 15 16 17 public void setBgroup(Group bgroup) { 18 this.bgroup = bgroup; 19 } 20 21 22 @Id 23 @GeneratedValue 24 public int getId() { 25 return id; 26 } 27 28 public void setId(int id) { 29 this.id = id; 30 } 31 public String getName() { 32 return name; 33 } 34 public void setName(String name) { 35 this.name = name; 36 } 37 38 }
数据库表的生成如下:
时间: 2024-10-19 12:01:12