Hibernate多对一外键关联(单向)

1.对应关系模型(多个人对应一个地址)


2.pojo类

public class Person {
	private Long id;
	private String name;
	private Address address;
	//省略get和set
}
public class Address {
	private int id;
	private String detail;
	//省略get和set
}
3.对应的表结构

mysql> desc person;
+-----------+------------+------+-----+---------+----------------+
| Field     | Type       | Null | Key | Default | Extra          |
+-----------+------------+------+-----+---------+----------------+
| personId  | bigint(20) | NO   | PRI | NULL    | auto_increment |
| addressId | int(11)    | NO   | MUL | NULL    |                |
+-----------+------------+------+-----+---------+----------------+
mysql> desc address;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| addressId | int(11)      | NO   | PRI | NULL    | auto_increment |
| detail    | varchar(255) | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
4.生成表结构的schema
| person | CREATE TABLE `person` (
  `personId` bigint(20) NOT NULL AUTO_INCREMENT,
  `addressId` int(11) NOT NULL,
  PRIMARY KEY (`personId`),
  KEY `FK_qdjkgeoknbp0k9s5r6rds2mj2` (`addressId`),
  CONSTRAINT `FK_qdjkgeoknbp0k9s5r6rds2mj2` FOREIGN KEY (`addressId`) REFERENCES
 `address` (`addressId`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 |
| address | CREATE TABLE `address` (
  `addressId` int(11) NOT NULL AUTO_INCREMENT,
  `detail` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`addressId`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 |
5.配置文件:

单项一对一关联,一个people对应一个address,将address属性加入people

<many-to-one name="address" 
	        column="addressId"
	        not-null="true"/>
这里用的是many-to-one,多对一,addressId为address的外键。
package org.hibernate.tutorial;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.tutorial.domain.Address;
import org.hibernate.tutorial.domain.Person;
import org.hibernate.tutorial.util.HibernateUtil;

public class uni_many2one_test {
	public static void main(String[] args) {
		
		Session session = HibernateUtil.getSession();
		Transaction tx = session.getTransaction();
		tx.begin();
		
		Address address = new Address();
		address.setDetail("hz");
		Person p1 = new Person();
		p1.setName("p1");
		Person p2 = new Person();
		p2.setName("p2");
		p1.setAddress(address);
		p2.setAddress(address);
		
		session.save(address);
		session.save(p1);
		session.save(p2);
		
		session.getTransaction().commit();
	}
}
address应在person之前保存,否则报异常(瞬态实例必须先保存):

 org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值