`

Hibernate一对一关系映射

    博客分类:
  • ssh
阅读更多
采用人与身份证之间的关系

Person类有3个属性
private int id ;
	private String name;
	private IdCard card;



IdCard类有3个属性
private int id;
	private String number;
	private Person person;



第一种情况,主键关联(person类定位主表)

Person类的xml映射文件

<class name="com.cao.po.Person" table="person">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
		<one-to-one name="card" />
	</class>


IdCard类的xml映射文件

<class name="com.cao.po.IdCard" table="id_card">
	<!-- card表的id属性即使主键又是外键,所以主键生成策略选择foreign -->
		<id name="id">
			<generator class="foreign">
			<!-- 指定外键根据那个属性生成 -->
				<param name="property">person</param>
			</generator>
		</id>
		<property name="number"/>
		<!-- constrained属性用于表结构上建立外键关系 -->
		<one-to-one name="person" constrained="true" />
	</class>



添加和查询操作


public static void add(){
		Session session = HibernateUtil.getSession();
		Transaction ts = HibernateUtil.getTs();
		
		Person p = new Person();
		p.setName("person1");
		
		IdCard card = new IdCard();
		card.setNumber("1234");
		//必须设置card的person属性,因为card表需要根据person生成主键
		card.setPerson(p);
		//person设置和不设置card属性,生成的表内容一样
		p.setCard(card);
		//不管先保持person还是先保持card,hibernate都会先保存person
		session.save(card);
		session.save(p);
		ts.commit();
		session.close();
	}
	public static void query(){
		Session session = HibernateUtil.getSession();
		
//		IdCard card = (IdCard) session.get(IdCard.class, 1);
//		//下面两句一句生成一条select语句
//		System.out.println(card.getNumber());
//		System.out.println(card.getPerson().getName());
		
		//只生成一条select语句,不能同时在一个方法中写两次查询,一级缓存
		Person p = (Person) session.get(Person.class, 1);
		System.out.println(p.getName());
		System.out.println(p.getCard().getNumber());
		
		
		
		session.close();
	}




第二种情况,外键关联

Person类的映射

<class name="com.cao.po.Person" table="person">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
		<!-- property-ref属性用于指定那个card属于该person,所指定的值要和外键表中many-to-one标签的相同 -->
		<one-to-one name="card" property-ref="person"/>
	</class>



IdCard类的映射


<class name="com.cao.po.IdCard" table="id_card">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="number"/>
		<!-- 生成外键列,因为是一对一所以要把unique配成true -->
		<many-to-one name="person" column="person_id" unique="true"/>
	</class>











0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics