Hibernate关联关系映射(单向篇)
Hibernate关联关系可分为单向关联和双向关联两大类。单向关联可以分为一对一、一对多、多对一和多对多4种关联方式,而多向关联可以分为一对一、一对多和多对多3种关联方式。 Hibernate连接管理类HibernateUtil.java public class HibernateUtil { private st
Hibernate关联关系可分为单向关联和双向关联两大类。单向关联可以分为一对一、一对多、多对一和多对多4种关联方式,而多向关联可以分为一对一、一对多和多对多3种关联方式。
Hibernate连接管理类HibernateUtil.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> HibernateUtil { <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> SessionFactory sessionFactory; <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> final ThreadLocal<Session> threadLocal = <span class="hljs-keyword">new</span> ThreadLocal<Session>(); <span class="hljs-keyword">static</span>{ <span class="hljs-keyword">try</span>{ Configuration cfg = <span class="hljs-keyword">new</span> Configuration().configure(); sessionFactory = cfg.buildSessionFactory(); }<span class="hljs-keyword">catch</span>(Throwable ex){ <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> ExceptionInInitializerError(ex); } } <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> SessionFactory <span class="hljs-title">getSessionFactory</span>(){ <span class="hljs-keyword">return</span> sessionFactory; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Session <span class="hljs-title">getSession</span>() throws HibernateException{ Session session = (Session)threadLocal.<span class="hljs-keyword">get</span>(); <span class="hljs-keyword">if</span>(session == <span class="hljs-keyword">null</span> || !session.isOpen()){ session = (sessionFactory != <span class="hljs-keyword">null</span>)?sessionFactory.openSession():<span class="hljs-keyword">null</span>; threadLocal.<span class="hljs-keyword">set</span>(session); } <span class="hljs-keyword">return</span> session; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">closeSession</span>() throws HibernateException{ Session session = (Session)threadLocal.<span class="hljs-keyword">get</span>(); threadLocal.<span class="hljs-keyword">set</span>(<span class="hljs-keyword">null</span>); <span class="hljs-keyword">if</span>(session != <span class="hljs-keyword">null</span>){ session.close(); } } <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">shutdown</span>(){ getSessionFactory().close(); } }</code>
1.单向的一对一关联
(1)通过主键关联
通过主键关联,是指两个数据表之间通过主键建立一对一的关联关系。这两张表的主键值是相同的,一张表改动时,另一张也会相关的发生改变,从而避免多余字段被创建,但基于主键关联的持久化类(其对应的数据表称为从表)不能拥有自己的主键生成策略,它的主键由关联类负责生成。另外,增加one-to-one元素来关联属性,必须为one-to-one元素增加constrained=”true”属性,表明该类主键由关联类生成。
示例:
实体类:
User.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> User { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> userid; <span class="hljs-keyword">private</span> String name; <span class="hljs-keyword">private</span> String password; <span class="hljs-keyword">private</span> Address address; <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getUserid</span>() { <span class="hljs-keyword">return</span> userid; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUserid</span>(<span class="hljs-keyword">int</span> userid) { <span class="hljs-keyword">this</span>.userid = userid; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span>() { <span class="hljs-keyword">return</span> name; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span>(String name) { <span class="hljs-keyword">this</span>.name = name; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getPassword</span>() { <span class="hljs-keyword">return</span> password; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPassword</span>(String password) { <span class="hljs-keyword">this</span>.password = password; } <span class="hljs-keyword">public</span> Address <span class="hljs-title">getAddress</span>() { <span class="hljs-keyword">return</span> address; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddress</span>(Address address) { <span class="hljs-keyword">this</span>.address = address; } }</code>
Address.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Address { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> addressid; <span class="hljs-keyword">private</span> String addressinfo; <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getAddressid</span>() { <span class="hljs-keyword">return</span> addressid; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddressid</span>(<span class="hljs-keyword">int</span> addressid) { <span class="hljs-keyword">this</span>.addressid = addressid; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getAddressinfo</span>() { <span class="hljs-keyword">return</span> addressinfo; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddressinfo</span>(String addressinfo) { <span class="hljs-keyword">this</span>.addressinfo = addressinfo; } }</code>
表结构:
user表:
address表:
配置文件:
User.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.User"</span> table=<span class="hljs-string">"user"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"id"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"user_id"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"foreign"</span>> <param <span class="hljs-property">name</span>=<span class="hljs-string">"property"</span>>address</param> </generator> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"name"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"name"</span>> </<span class="hljs-keyword">property</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"password"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"password"</span>> </<span class="hljs-keyword">property</span>> <one-<span class="hljs-keyword">to</span>-one <span class="hljs-property">name</span>=<span class="hljs-string">"address"</span> <span class="hljs-type">class</span>=<span class="hljs-string">"Address"</span> constrained=<span class="hljs-string">"true"</span>></one-<span class="hljs-keyword">to</span>-one> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
Address.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.Address"</span> table=<span class="hljs-string">"address"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"addressid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressinfo"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"addressinfo"</span>> </<span class="hljs-keyword">property</span>> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
测试类Test.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Test { <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); User u = <span class="hljs-keyword">new</span> User(); u.setName(<span class="hljs-string">"sbw"</span>); u.setPassword(<span class="hljs-string">"123"</span>); Address a = <span class="hljs-keyword">new</span> Address(); a.setAddressinfo(<span class="hljs-string">"heu"</span>); u.setAddress(a); session.save(a); session.save(u); tx.commit(); HibernateUtil.closeSession(); } }</code>
运行结果:
(2)通过外键关联
通过外键关联时两张数据表的主键是不同的,通过在一张表中添加外键列来保持一对一的关系。配置外键关联关系时需要使用many-to-one元素。因为通过外键关联的一对一关系,本质上是多对一关系的特例。因此,只需在many-to-one元素中增加unique=“true”属性即可,这相当于在多的一端增加了唯一性的约束,表示多的一端也必须是唯一的,这样就变成为单向的一对一关系了。
示例:
实体类与通过主键关联相同。
表结构:
user表
address表
配置文件:
User.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.User"</span> table=<span class="hljs-string">"user"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"userid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"userid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"name"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"name"</span>> </<span class="hljs-keyword">property</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"password"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"password"</span>> </<span class="hljs-keyword">property</span>> <many-<span class="hljs-keyword">to</span>-one <span class="hljs-property">name</span>=<span class="hljs-string">"address"</span> <span class="hljs-type">class</span>=<span class="hljs-string">"com.entity.Address"</span> unique=<span class="hljs-string">"true"</span> column=<span class="hljs-string">"addressid"</span>></many-<span class="hljs-keyword">to</span>-one> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
Address.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.Address"</span> table=<span class="hljs-string">"address"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"addressid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressinfo"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"addressinfo"</span>> </<span class="hljs-keyword">property</span>> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
测试类与通过主键关联一样
运行结果:
2.单向一对多关联
单向的一对多关联映射关系主要是通过外键来关联的。一对多的关联映射是在表示多的一方的数据表中增加一个外键,并由“一”的一方指向“多”的一方。单向的一对多关联的持久化类里需要包含一个集合属性,在“一”的一方访问“多”的一方时,“多”的一方将以集合的形式来体现。
示例:
实体类:
User.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> User { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> userid; <span class="hljs-keyword">private</span> String name; <span class="hljs-keyword">private</span> String password; <span class="hljs-keyword">private</span> Set<Address> address = <span class="hljs-keyword">new</span> HashSet<Address>(); <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getUserid</span>() { <span class="hljs-keyword">return</span> userid; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUserid</span>(<span class="hljs-keyword">int</span> userid) { <span class="hljs-keyword">this</span>.userid = userid; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span>() { <span class="hljs-keyword">return</span> name; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span>(String name) { <span class="hljs-keyword">this</span>.name = name; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getPassword</span>() { <span class="hljs-keyword">return</span> password; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPassword</span>(String password) { <span class="hljs-keyword">this</span>.password = password; } <span class="hljs-keyword">public</span> Set<Address> <span class="hljs-title">getAddress</span>() { <span class="hljs-keyword">return</span> address; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddress</span>(Set<Address> address) { <span class="hljs-keyword">this</span>.address = address; } }</code>
Address.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Address { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> addressid; <span class="hljs-keyword">private</span> String addressinfo; <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getAddressid</span>() { <span class="hljs-keyword">return</span> addressid; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddressid</span>(<span class="hljs-keyword">int</span> addressid) { <span class="hljs-keyword">this</span>.addressid = addressid; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getAddressinfo</span>() { <span class="hljs-keyword">return</span> addressinfo; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddressinfo</span>(String addressinfo) { <span class="hljs-keyword">this</span>.addressinfo = addressinfo; } }</code>
表结构:
User表
Address表
配置文件
User.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.User"</span> table=<span class="hljs-string">"user"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"userid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"userid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"name"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"name"</span>> </<span class="hljs-keyword">property</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"password"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"password"</span>> </<span class="hljs-keyword">property</span>> <<span class="hljs-keyword">set</span> <span class="hljs-property">name</span>=<span class="hljs-string">"address"</span> table=<span class="hljs-string">"address"</span> inverse=<span class="hljs-string">"false"</span> lazy=<span class="hljs-string">"true"</span>> <key> <column <span class="hljs-property">name</span>=<span class="hljs-string">"userid"</span>/> </key> <one-<span class="hljs-keyword">to</span>-many <span class="hljs-type">class</span>=<span class="hljs-string">"com.entity.User"</span>/> </<span class="hljs-keyword">set</span>> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
Address.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.Address"</span> table=<span class="hljs-string">"address"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"addressid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressinfo"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"addressinfo"</span>> </<span class="hljs-keyword">property</span>> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
测试代码
Test.java
<code class=" hljs avrasm">public class Test { public static void main(String[] args){ Session session = HibernateUtil<span class="hljs-preprocessor">.getSession</span>()<span class="hljs-comment">;</span> Transaction tx = session<span class="hljs-preprocessor">.beginTransaction</span>()<span class="hljs-comment">;</span> User u = new User()<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setName</span>(<span class="hljs-string">"sbw"</span>)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setPassword</span>(<span class="hljs-string">"123"</span>)<span class="hljs-comment">;</span> Address a = new Address()<span class="hljs-comment">;</span> a<span class="hljs-preprocessor">.setAddressinfo</span>(<span class="hljs-string">"heu"</span>)<span class="hljs-comment">;</span> Address a1 = new Address()<span class="hljs-comment">;</span> a1<span class="hljs-preprocessor">.setAddressinfo</span>(<span class="hljs-string">"hrb"</span>)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.getAddress</span>()<span class="hljs-preprocessor">.add</span>(a)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.getAddress</span>()<span class="hljs-preprocessor">.add</span>(a1)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(a)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(a1)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(u)<span class="hljs-comment">;</span> tx<span class="hljs-preprocessor">.commit</span>()<span class="hljs-comment">;</span> HibernateUtil<span class="hljs-preprocessor">.closeSession</span>()<span class="hljs-comment">;</span> } }</code>
运行结果:
3.单向的多对一关联
单向的多对一关联映射关系也是通过外键来关联的。多对一的映射方式类似于一对多的映射方式,不过它的映射关系是由“多”的一方指向“一”的一方。在表示“多”的一方的数据表中增加一个外键来指向表示“一”的一方的数据表,“一”的一方作为主表,”多“的一方作为从表。
示例:
实体类
User.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> User { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> userid; <span class="hljs-keyword">private</span> String name; <span class="hljs-keyword">private</span> String password; <span class="hljs-keyword">private</span> Address address = <span class="hljs-keyword">new</span> Address(); <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getUserid</span>() { <span class="hljs-keyword">return</span> userid; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUserid</span>(<span class="hljs-keyword">int</span> userid) { <span class="hljs-keyword">this</span>.userid = userid; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span>() { <span class="hljs-keyword">return</span> name; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span>(String name) { <span class="hljs-keyword">this</span>.name = name; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getPassword</span>() { <span class="hljs-keyword">return</span> password; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPassword</span>(String password) { <span class="hljs-keyword">this</span>.password = password; } <span class="hljs-keyword">public</span> Address <span class="hljs-title">getAddress</span>() { <span class="hljs-keyword">return</span> address; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddress</span>(Address address) { <span class="hljs-keyword">this</span>.address = address; } }</code>
Address.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Address { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> addressid; <span class="hljs-keyword">private</span> String addressinfo; <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getAddressid</span>() { <span class="hljs-keyword">return</span> addressid; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddressid</span>(<span class="hljs-keyword">int</span> addressid) { <span class="hljs-keyword">this</span>.addressid = addressid; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getAddressinfo</span>() { <span class="hljs-keyword">return</span> addressinfo; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddressinfo</span>(String addressinfo) { <span class="hljs-keyword">this</span>.addressinfo = addressinfo; } }</code>
表结构:
user表
address表
配置文件:
User.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.User"</span> table=<span class="hljs-string">"user"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"userid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"userid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"name"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"name"</span>> </<span class="hljs-keyword">property</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"password"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"password"</span>> </<span class="hljs-keyword">property</span>> <many-<span class="hljs-keyword">to</span>-one <span class="hljs-property">name</span>=<span class="hljs-string">"address"</span> column=<span class="hljs-string">"addressid"</span>/> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
Address.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.Address"</span> table=<span class="hljs-string">"address"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"addressid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressinfo"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"addressinfo"</span>> </<span class="hljs-keyword">property</span>> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
测试类Test.java
<code class=" hljs avrasm">public class Test { public static void main(String[] args){ Session session = HibernateUtil<span class="hljs-preprocessor">.getSession</span>()<span class="hljs-comment">;</span> Transaction tx = session<span class="hljs-preprocessor">.beginTransaction</span>()<span class="hljs-comment">;</span> User u = new User()<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setName</span>(<span class="hljs-string">"sbw"</span>)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setPassword</span>(<span class="hljs-string">"123"</span>)<span class="hljs-comment">;</span> User u1 = new User()<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setName</span>(<span class="hljs-string">"gaoya"</span>)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setPassword</span>(<span class="hljs-string">"456"</span>)<span class="hljs-comment">;</span> Address a = new Address()<span class="hljs-comment">;</span> a<span class="hljs-preprocessor">.setAddressinfo</span>(<span class="hljs-string">"heu"</span>)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setAddress</span>(a)<span class="hljs-comment">;</span> u1<span class="hljs-preprocessor">.setAddress</span>(a)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(a)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(u)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(u1)<span class="hljs-comment">;</span> tx<span class="hljs-preprocessor">.commit</span>()<span class="hljs-comment">;</span> HibernateUtil<span class="hljs-preprocessor">.closeSession</span>()<span class="hljs-comment">;</span> } }</code>
测试结果:
4.单向的多对多关联
多对多关联在数据库中是比较常见的,它利用中间表将两个主表关联起来。中间表的作用是将两张表的主键作为其外键,通过外键建立这两张表的映射关系。在单向的多对多关联中,需要在主控端的类定义中增加一个Set集合属性,使得被关联一方的类的实例以集合的形式存在。
示例:
实体类:
User.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> User { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> userid; <span class="hljs-keyword">private</span> String name; <span class="hljs-keyword">private</span> String password; <span class="hljs-keyword">private</span> Set<Address> address = <span class="hljs-keyword">new</span> HashSet<Address>(); <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getUserid</span>() { <span class="hljs-keyword">return</span> userid; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUserid</span>(<span class="hljs-keyword">int</span> userid) { <span class="hljs-keyword">this</span>.userid = userid; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span>() { <span class="hljs-keyword">return</span> name; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span>(String name) { <span class="hljs-keyword">this</span>.name = name; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getPassword</span>() { <span class="hljs-keyword">return</span> password; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPassword</span>(String password) { <span class="hljs-keyword">this</span>.password = password; } <span class="hljs-keyword">public</span> Set<Address> <span class="hljs-title">getAddress</span>() { <span class="hljs-keyword">return</span> address; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddress</span>(Set<Address> address) { <span class="hljs-keyword">this</span>.address = address; } }</code>
Address.java
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Address { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> addressid; <span class="hljs-keyword">private</span> String addressinfo; <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getAddressid</span>() { <span class="hljs-keyword">return</span> addressid; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddressid</span>(<span class="hljs-keyword">int</span> addressid) { <span class="hljs-keyword">this</span>.addressid = addressid; } <span class="hljs-keyword">public</span> String <span class="hljs-title">getAddressinfo</span>() { <span class="hljs-keyword">return</span> addressinfo; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddressinfo</span>(String addressinfo) { <span class="hljs-keyword">this</span>.addressinfo = addressinfo; } }</code>
表结构:
user表:
user_address表:
address表:
配置文件:
User.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.User"</span> table=<span class="hljs-string">"user"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"userid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"userid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"name"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"name"</span>> </<span class="hljs-keyword">property</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"password"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"password"</span>> </<span class="hljs-keyword">property</span>> <<span class="hljs-keyword">set</span> <span class="hljs-property">name</span>=<span class="hljs-string">"address"</span> table=<span class="hljs-string">"user_address"</span>> <key column=<span class="hljs-string">"userid"</span>/> <many-<span class="hljs-keyword">to</span>-many column=<span class="hljs-string">"addressid"</span> <span class="hljs-type">class</span>=<span class="hljs-string">"com.entity.Address"</span>/> </<span class="hljs-keyword">set</span>> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
Address.hbm.xml
<code class=" hljs applescript"><hibernate-mapping> <<span class="hljs-type">class</span> <span class="hljs-property">name</span>=<span class="hljs-string">"com.entity.Address"</span> table=<span class="hljs-string">"address"</span>> <<span class="hljs-property">id</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressid"</span> type=<span class="hljs-string">"java.lang.Integer"</span> column=<span class="hljs-string">"addressid"</span>> <generator <span class="hljs-type">class</span>=<span class="hljs-string">"identity"</span>/> </<span class="hljs-property">id</span>> <<span class="hljs-keyword">property</span> <span class="hljs-property">name</span>=<span class="hljs-string">"addressinfo"</span> type=<span class="hljs-string">"java.lang.String"</span> column=<span class="hljs-string">"addressinfo"</span>> </<span class="hljs-keyword">property</span>> </<span class="hljs-type">class</span>> </hibernate-mapping></code>
测试代码Test.java
<code class=" hljs avrasm">public class Test { public static void main(String[] args){ Session session = HibernateUtil<span class="hljs-preprocessor">.getSession</span>()<span class="hljs-comment">;</span> Transaction tx = session<span class="hljs-preprocessor">.beginTransaction</span>()<span class="hljs-comment">;</span> User u = new User()<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setName</span>(<span class="hljs-string">"sbw"</span>)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.setPassword</span>(<span class="hljs-string">"123"</span>)<span class="hljs-comment">; </span> User u1 = new User()<span class="hljs-comment">;</span> u1<span class="hljs-preprocessor">.setName</span>(<span class="hljs-string">"gaoya"</span>)<span class="hljs-comment">;</span> u1<span class="hljs-preprocessor">.setPassword</span>(<span class="hljs-string">"456"</span>)<span class="hljs-comment">;</span> Address a = new Address()<span class="hljs-comment">;</span> a<span class="hljs-preprocessor">.setAddressinfo</span>(<span class="hljs-string">"heu"</span>)<span class="hljs-comment">;</span> Address a1 = new Address()<span class="hljs-comment">;</span> a1<span class="hljs-preprocessor">.setAddressinfo</span>(<span class="hljs-string">"hrb"</span>)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.getAddress</span>()<span class="hljs-preprocessor">.add</span>(a)<span class="hljs-comment">;</span> u<span class="hljs-preprocessor">.getAddress</span>()<span class="hljs-preprocessor">.add</span>(a1)<span class="hljs-comment">;</span> u1<span class="hljs-preprocessor">.getAddress</span>()<span class="hljs-preprocessor">.add</span>(a)<span class="hljs-comment">;</span> u1<span class="hljs-preprocessor">.getAddress</span>()<span class="hljs-preprocessor">.add</span>(a1)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(a)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(a1)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(u)<span class="hljs-comment">;</span> session<span class="hljs-preprocessor">.save</span>(u1)<span class="hljs-comment">;</span> tx<span class="hljs-preprocessor">.commit</span>()<span class="hljs-comment">;</span> HibernateUtil<span class="hljs-preprocessor">.closeSession</span>()<span class="hljs-comment">;</span> } }</code>
测试结果:

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在SpringBoot项目中集成Hibernate前言Hibernate是一个流行的ORM(对象关系映射)框架,它可以将Java对象映射到数据库表,从而方便地进行持久化操作。在SpringBoot项目中,集成Hibernate可以帮助我们更轻松地进行数据库操作,本文将介绍如何在SpringBoot项目中集成Hibernate,并提供相应的示例。1.引入依赖在pom.xml文件中引入以下依赖:org.springframework.bootspring-boot-starter-data-jpam

什么是JPA?它与JDBC有什么区别?JPA(JavaPersistenceapi)是一个用于对象关系映射(ORM)的标准接口,它允许Java开发者使用熟悉的Java对象来操作数据库,而无需编写直接针对数据库的sql查询。而JDBC(JavaDatabaseConnectivity)是Java用于连接数据库的标准API,它需要开发者使用SQL语句来操作数据库。JPA将JDBC封装起来,为对象-关系映射提供了更方便、更高级别的API,简化了数据访问操作。在JPA中,什么是实体(Entity)?实体

Java是一种面向对象编程语言,它被广泛地应用于软件开发领域。Hibernate是一种流行的Java持久化框架,它提供了一种简单且高效的方式来管理Java对象的持久化。然而,开发过程中经常会遇到Hibernate错误,这些错误可能会导致程序的异常终止或者不稳定。如何处理和避免Hibernate错误成为了Java开发者必须掌握的能力。本文将介绍一些常见的Hib

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。详细介绍:1、实现方式,Hibernate是一个完整的对象/关系映射解决方案,将对象与数据库表进行映射,MyBatis则需要开发者手动编写SQL语句以及ResultMap;2、性能,Hibernate在开发速度上可能比MyBatis快,因为Hibernate简化了DAO层等等。

Hibernate的一对多和多对多Hibernate是一个优秀的ORM框架,它简化了Java应用程序与关系型数据库之间的数据访问。在Hibernate中,我们可以使用一对多和多对多的关系来处理复杂的数据模型。Hibernate的一对多在Hibernate中,一对多关系是指一个实体类对应多个另一个实体类。比如,一个订单(Order)可以对应多个订单项(OrderItem),一个用户(User)可以对应多个订单(Order)。要在Hibernate中实现一对多关系,需要在实体类中定义一个集合属性来存

如何让MySQL外键和主键自动关联起来?在MySQL数据库中,外键和主键是非常重要的概念,它们能够帮助我们在不同表之间建立关联关系,保证数据的完整性和一致性。在实际的应用过程中,经常需要让外键自动关联到对应的主键上,以避免数据不一致的情况发生。下面将介绍如何通过具体的代码示例实现这一功能。首先,我们需要创建两个表,一个表作为主表,另一个表作为从表。在主表中创

“C”编译器根据优先级和关联性规则对表达式进行求值。如果表达式包含不同优先级运算符,则会考虑优先级规则。这里,首先评估10*2,因为'*'比'-'和'='具有更高的优先级如果表达式包含相同的优先级,则考虑关联性规则,即从左到右(或从右到左)。

安卓系统与Linux内核是息息相关的两个实体,它们之间的关系紧密而又复杂。在安卓系统中,Linux内核充当着重要的角色,为安卓系统提供了底层的硬件驱动和系统调用支持。本文将探讨安卓系统与Linux内核之间的关系,以及它们是如何交互、协同工作的,同时提供一些具体的代码示例。安卓系统是基于Linux内核开发的移动操作系统,主要用于智能手机、平板电脑等移动设备。L
