https://github.com/Amant-huangqi/test_hibernate
1.一对多关系
表间关系:城市表与用户表
1.表结构:在“多”的一方即用户表设置外键
CREATE TABLE `city` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`city_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`city_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_user` (`city_id`),
CONSTRAINT `fk_user` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
2.域模型:
public class Users {
private Integer id;
private String name;
//在“多”的一方使用对象表示
private Citys city;
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 Citys getCity() {
return city;
}
public void setCity(Citys city) {
this.city = city;
}
public class Citys {
private Integer id;
private String cityName;
//在“一”的一方使用 数组表示 “多”
private Set<Users> users=new HashSet<Users>(0);
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public Set<Users> getUsers() {
return users;
}
public void setUsers(Set<Users> users) {
this.users = users;
}
}
4.映射文件
Users.hbm.xml
<hibernate-mapping>
<class name="com.hq.pojo.Users" table="user" catalog="test_hibernate">
<id name="id" type="java.lang.Integer">
<column name="id"></column>
<generator class="native"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
<!-- <property name="cityId" type="java.lang.Integer">
<column name="city_id"></column>
</property> -->
<many-to-one name="city" class="com.hq.pojo.Citys" column="city_id" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
citys.hbm.xml
<hibernate-mapping>
<class name="com.hq.pojo.Citys" table="city" catalog="test_hibernate">
<id name="id" type="java.lang.Integer">
<column name="city_id"></column>
<generator class="native"></generator>
</id>
<property name="cityName" type="java.lang.String">
<column name="city_name"></column>
</property>
<set name="Users" cascade="save-update" inverse="true">
<key column="city_id"></key>
<one-to-many class="com.hq.pojo.Users" />
</set>
</class>
</hibernate-mapping>
5.测试方法
public class CitysDaoImplTest {
private ICitysDao citysDao = new CitysDaoImpl();
// @Test
public void save() {
Citys city = new Citys();
city.setCityName("北京");
Users user1 = new Users();
user1.setName("11");
user1.setCity(city);
city.getUsers().add(user1);
boolean flag = citysDao.save(city);
if (flag) {
System.out.println("保存成功");
} else {
System.out.println("保存失败");
}
}
@Test
public void delete() {
Citys city = citysDao.findCitysById(1);
if (city != null) {
boolean flag = citysDao.delete(city);
if (flag) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
} else {
System.out.println("数据为空");
}
}
//@Test
public void update(){
Citys city = citysDao.findCitysById(1);
city.setCityName("123");
boolean flag = citysDao.update(city);
if (flag) {
System.out.println("更新成功");
} else {
System.out.println("更新失败");
}
}
}
public class TestUsersDao {
private IUsersDao usersDao = new UsersDaoImpl();
private ICitysDao citysDao = new CitysDaoImpl();
/**
* 在一对多关系中修改 外键
* 一定要拿到旧的更新新的
* Ex: 修改User表中的city_id
*/
//@Test
public void update(){
Users user=usersDao.getUsersById(1);
Citys city=citysDao.findCitysById(2);
user.setCity(city);
usersDao.update(user);
}
@Test
public void delete(){
Users user=usersDao.getUsersById(2);
usersDao.delete(user);
}
}
2.一对一关系
表间关系:身份证表和用户表
1.表结构
CREATE TABLE `card` (
`card_num` bigint(11) NOT NULL,
`card_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`),
CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.映射文件
<hibernate-mapping>
<class name="com.hq.pojo.Card" table="card" catalog="test_hibernate">
<id name="userId" type="java.lang.Integer">
<column name="user_id"></column>
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="cardNum" type="java.lang.Long">
<column name="card_num"></column>
</property>
<property name="endTime" type="java.util.Date">
<column name="card_time"></column>
</property>
<one-to-one name="user" class="com.hq.pojo.Users"></one-to-one>
</class>
</hibernate-mapping>
3.域模型
public class Card {
private Long cardNum;
private Date endTime;
private Integer userId;//主键
private Users user; //外键
public Long getCardNum() {
return cardNum;
}
public void setCardNum(Long cardNum) {
this.cardNum = cardNum;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Users getUser() {
return user;
}
public void setUser(Users user) {
this.user = user;
}
}
4.测试类
public class CardsDaoImplTest {
private ICardsDao cardsDao = new CardsDaoImpl();
@Test
public void test() {
Card card=cardsDao.findCardById(1);
System.out.println(card.getCardNum());
System.out.println(card.getEndTime());
System.out.println(card.getUser().getName());//外键关联对象
System.out.println(card.getUserId());//主键
}
}