模型user,address
address对user进行外键关联,意思就是address的主键是由user的主键关联生成的,现有user后有address
user sql语句
CREATE TABLE `NewTable` ( `userid` int(11) NOT NULL AUTO_INCREMENT , `account` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`userid`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=6 ROW_FORMAT=COMPACT ;
address sql语句
CREATE TABLE `NewTable` ( `addressid` int(11) NOT NULL AUTO_INCREMENT , `addressinfo` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`addressid`), FOREIGN KEY (`addressid`) REFERENCES `user` (`userid`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=6 ROW_FORMAT=COMPACT ;
user 类
package dto; import java.io.Serializable; public class User{ private int userid; private String account; private String password; public int getUserid() { return userid; } public void setUserid(int userid) { this.userid = userid; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
user.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2015-6-17 22:15:11 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="dto.User" table="user" catalog="snlu"> <id name="userid" type="java.lang.Integer" access="field"> <column name="userid" /> <generator class="identity" /> </id> <property name="account" type="string"> <column name="account" /> </property> <property name="password" type="string"> <column name="password" /> </property> </class> </hibernate-mapping>
address类
package dto; public class Address { private String addressinfo; private int addressid; private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getAddressinfo() { return addressinfo; } public void setAddressinfo(String addressinfo) { this.addressinfo = addressinfo; } public int getAddressid() { return addressid; } public void setAddressid(int addressid) { this.addressid = addressid; } }
address.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2015-6-17 22:15:11 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="dto.Address" table="address" catalog="snlu"> <id name="addressid" type="java.lang.Integer" access="field"> <column name="addressid" /> <generator class="foreign"> <param name="property">user</param> </generator> </id> <one-to-one name="user" class="dto.User" constrained="true"></one-to-one> <property name="addressinfo" type="string"> <column name="addressinfo" /> </property> </class> </hibernate-mapping>
注:若使用hibernate tools生成实体类xml很可能生成的为一对一主键双向关联注意查看 on-to-one标签
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.bytecode.use_reflection_optimizer">false</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/snlu</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.jdbc.fetch_size">5</property> <property name="hibernate.max_fetch_depth">1</property> <property name="hibernate.search.autoregister_listeners">false</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.validator.apply_to_ddl">false</property> <mapping resource="dto/User.hbm.xml"/> <mapping resource="dto/Address.hbm.xml"/> </session-factory> </hibernate-configuration>
main
package test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import util.HibernateUtil; import dao.DAOFactory; import dao.UserDAO; import dao.UserDAOImpl; import dto.Address; import dto.User; public class UserTest { public static void main(String[] args) { Session session=HibernateUtil.getSessionFactory().openSession(); Transaction tx=session.beginTransaction(); User user=new User(); user.setAccount("jack"); user.setPassword("111111"); Address a=new Address(); a.setAddressinfo("america"); a.setUser(user); session.save(user); session.save(a); tx.commit(); HibernateUtil.closeSession(); } }
hibernateUtil可在上篇文章hibernate速成中找到
注:将save(user)注释掉,只跑save(address)仍会保存user