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

来源:互联网 发布:时间安排软件 编辑:程序博客网 时间:2024/05/15 23:53

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










0 0
原创粉丝点击