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