知识点
相关文章
更多最近更新
更多hibernate中OneToOne双向
2019-03-28 00:10|来源: 领悟书生
前一篇日记hibernate中OneToOne单向,这次我们说了解一下OneToOne中的双向。同样是使用身份证和人的关系来举例说明。
修改Person的实体类和映射关系
Person.java
package org.zttc.itat.model; public class Person { private int id; private String name; private IDCard idCard; //set get 方法省略 }
Person.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"> <hibernate-mapping package="org.zttc.itat.model"> <class name="Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- name表示属性的名称,property-ref表示由对端来维护关系--> <one-to-one name="idCard" property-ref="person"/> </class> </hibernate-mapping>
看看测试方法:
@Test public void testAdd03() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); /* * 此时,由于使用的是IDCard来维护关系(外键在哪一端就由哪一段来维护) * 通过p.setIdCard就无效,所以关系不会更新(外键的值为NULL) */ IDCard id = new IDCard(); id.setNo("123"); session.save(id); Person p = new Person(); p.setName("zzz"); p.setIdCard(id); session.save(p); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testAdd04() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Person p = new Person(); p.setName("zzzzz"); session.save(p); IDCard id = new IDCard(); id.setNo("12322"); id.setPerson(p); session.save(id); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testLoad01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Person p = (Person)session.load(Person.class, 4); //只要取出的是没有维护关系的这一方,会自动将关联对象取出(left outer join),会发出1条sql //由于person端没有维护关系,所以不会进行延迟加载,所以1条就搞定了 System.out.println(p.getName()+","+p.getIdCard().getNo()); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testLoad02() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); //此时会发出三条SQL语句 IDCard id = (IDCard)session.load(IDCard.class, 4); //此时没有使用idCard的Person,会延迟加载,目前只是发出1条SQL System.out.println(id.getNo()); //要去取person同时也会取出这个person的idCard,这里就不会使用join来取出,所以会发出2条sql System.out.println(id.getPerson().getName()); //特别注意:如果没有双向,此时会发出2条,一条去idCard,一条延迟加载取person session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } }
最佳实践就是,One2One的时候最好不要使用双向关联,如果使用双向关联,尽可能在没有维护关系的一边取数据,hibernate会自动完成joine,仅仅只会发一条sql;如果使用维护关系端取数据,在通过延迟加载取关联对象时会同时再去取person的idCard关联,所以会发3条
本文链接:hibernate中OneToOne双向,由领悟书生原创(笔记),转载请注明出处http://www.656463.com/article/401
相关问答
更多-
@Formula被忽略,因为它仅作为@Column替代品有效。 而那个不用于关系映射。 但是你可以使用@Where代替,它存在于集合中: @OneToMany @JoinTable(name = "PRODUCTION_MEDIAASSET_NEW", joinColumns = @JoinColumn(name = "PRODUCTION_ORDER_ID", referencedColumnName = "MEDIAASSET_ORDER_ID")) @Where("KEY_TEXT = 1") pri ...
-
你必须映射你的类。 public class User { ... @OneToOne (mappedBy="user") private UserPicture userPicture; ... } public class UserPicture { ... @OneToOne @JoinColumn (name="user") private User user; ... } You have to map your clas ...
-
Blow,如果A和B 共享使用主键将两个实体连接在一起的主键列 ,则应该使用@PrimaryKeyJoinColumn @Entity public class A implements Serializable { private MutableInt id = new MutableInt(); private B b; public void setIdAsMutableInt(MutableInt id) { this.id = id; } ...
-
您的mappedBy应该位于您想要首先保存的子实体中。 所以这里映射的应该是在BankAccount 。 您还应该在父实体中使用@JoinColumn ,因此子的外键可以存储在父表中。 例如: @Entity public class User implements Serializable { private String username; @OneToOne( optional = false, orphanRemoval = true, fetch = FetchType.LAZY, ...
-
只有在需要时才将它标记为FetchType.LAZY以延迟加载地址。 @OneToOne(optional=true, fetch=FetchType.LAZY) @Cascade(org.hibernate.annotations.CascadeType.ALL) private Address managementAddress; Mark it will FetchType.LAZY to lazy load addresses only when required. @OneToOne(optio ...
-
我认为你的问题是你为同一个映射定义了两个mappedBy属性,所以Hibernate会在映射中感到困惑。 所以使用其中两个是必要的,你有两个选择: 1.在类中只使用一个Command对象,并将其映射到OneToOne如下所示: @OneToOne(cascade = CascadeType.ALL) private Command parentCommand; 2.或者使它像你一样在你的类中使用两个Command对象,并使用OneToOne映射它们中的两个, 但是只使用带有child的mappedBy来引 ...
-
当谈到JPA关系时,您有责任更新关系的双方。 在这里, cancel方法应该更新tableA和tableB 。 否则,你得到的是tableB中的一个EXT_ ID值,它在tableA中没有对应关系。 然后,在检索tableB实体时,Hibernate期望相应的tableA实体,该实体不再存在并且引发错误。 如果tableB实体在其相应的tableA实体被删除时应该保留,则表B的extId需要为空。 还有一件事:与TableA类似, TableB需要将extId或tableA声明为extId updatabl ...
-
显然@AttributeOverride工作,即使从文档中看起来我应该使用@AssociationOverride 。 Apparently @AttributeOverride worked, even though, from the documentation, it seemed I was supposed to use @AssociationOverride.
-
JPA 2.0双向OneToOne不会在DB中创建FK列(JPA 2.0 Bidirectional OneToOne doesn't create FK Column in DB)[2024-01-25]
数据库中不需要两个外键来实现单个关联。 一个就足够了。 要获取给定员工的停车位,您需要在停车位表中查找ID等于给定员工的PARKINGSPACE_ID的行。 为了给员工一个停车位,你可以找到员工表中的行,如果给定的停车位,该行的PARKINGSPACE_ID等于ID 。 如果有两个外键,则停车位可以引用将引用另一个停车位的员工,使数据库处于不连贯状态。 You don't need two foreign keys in the database to materialize a single associ ... -
需要一个Hibernate中主键@OneToOne映射的示例(Need an example of a primary-key @OneToOne mapping in Hibernate)[2022-11-15]
您打算在PaperChequeStopMetaData和PaperCheque之间建立1-1的关系? 如果是这样,你不能将PaperCheque实例定义为PaperChequeStopMetaData的@Id,你必须在PaperChequeStopMetaData中定义一个单独的@Id列。 Your intention is to have a 1-1 relationship between PaperChequeStopMetaData and PaperCheque? If that's so, yo ...