Hibernate01(无表关联的单项N-1)

原创 2016年06月01日 22:18:50


单项N-1无连接表关联,单项的N-1只需从N的一端就可以访问1的一端,比如多个人对应一个地址,从人这一段找到地址,对于N-1关联(不管是单项关联还是双向关联),都需要在N的一端使用@ManyToOne修饰代表关联的实体的属性。


  注解属性:casade

fetch

optional

targetEntiy

对于无连接表的N-1而言 只需要在N的一端增加一列外键,让外键记录该对象所属的实体即可,hibernate可以使用@JoinColumn来修饰代表关联的实体属性。@JoinColumn用于映射底层外键列。












package com.dt.pojo;



import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;




/**
 * 无连接表的单项N-1关联
 * 程序是需要在N的一端增加一个外键列即可
 * 
 * */












@Entity
@Table(name="person_inf")
public class Person {

@Id
@Column(name="person_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id ;
    private String name;
    private Integer age;
    
    
    @ManyToOne(targetEntity=Address.class) //定义person实体关联的address实体
    @JoinColumn(name="address_id",nullable=false) //映射外键关联。指定外键列的列名是addess_id
    @Cascade(CascadeType.ALL) //级联策略 所有持久化都级联到关联的实体
    private Address address;
    
    
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}




}














package com.dt.pojo;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name="address_inf")
public class Address {


@Id
@Column(name="address_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer addressId;
private String addressDetail;



public Address(String addressDetail) {
super();
this.addressDetail = addressDetail;
}
public Integer getAddressId() {
return addressId;
}
public void setAddressId(Integer addressId) {
this.addressId = addressId;
}
public String getAddressDetail() {
return addressDetail;
}
public void setAddressDetail(String addressDetail) {
this.addressDetail = addressDetail;
}


}









package com.dt.util;


import org.hibernate.Transaction;


import com.dt.pojo.Address;
import com.dt.pojo.Person;


import org.hibernate.Session;


import java.util.*;
/**
 * @author  dt
 * @version  1.0
 */
public class PersonManager
{
public static void main(String[] args)
{
PersonManager mgr = new PersonManager();
mgr.createAndStorePerson();
HibernateUtil.sessionFactory.close();
}
private void createAndStorePerson()
{
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
// 创建Person对象
Person person = new Person();
person.setAge(29);
person.setName("张三");

Address a1 = new Address("广州天河");


person.setAddress(a1);//设置Person和Address之间的关联关系

session.persist(person);//持久化person对象

Address a2 = new Address("上海虹口"); //创建一个瞬时态的Address对象
person.setAddress(a2);//修改持久化状态的Person对象

/*


* */

tx.commit();
HibernateUtil.closeSession();
}
}




<?xml version="1.0" encoding="GBK"?>
<!-- 指定Hibernate配置文件的DTD信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- hibernate-configuration是配置文件的根元素 -->
<hibernate-configuration>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,其中hibernate是本应用连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">admin</property>
<!-- 指定连接池里最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 指定连接池里最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 指定连接池里连接的超时时长 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 指定连接池里最大缓存多少个Statement对象 -->
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- 指定数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 根据需要自动创建数据库 -->
<property name="hbm2ddl.auto">update</property>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<property name="show_sql">true</property>
<!-- 将SQL脚本进行格式化后再输出 -->
<property name="hibernate.format_sql">true</property>
<!-- 罗列所有持久化类的类名 -->
<mapping class="com.dt.pojo.Person"/>
<mapping class="com.dt.pojo.Address"/>
</session-factory>
</hibernate-configuration>









版权声明:本文为博主原创文章,未经博主允许不得转载。

HQL实现多对多关联查询(无关系表的映射)

HQL实现多对多关联查询(无关系表的映射) 目录: 应用场景演示 [一]、应用场景 在用注解的方式(@ManyToMany @JoinTable)实现多对多映射时,并没有具体的多对多关系表...
  • actuutuu
  • actuutuu
  • 2014年04月28日 13:48
  • 2088

使用hql或条件查询解决一对多关联查询的N+1查询问题

如下两个实体类有一对多和多对一的双从关联 public class DictType { @Id private int id; private String className; priva...
  • jqncc
  • jqncc
  • 2014年01月06日 10:36
  • 3133

【Hibernate】二、Hibernate映射详解(一对一单向关联)

Hibernate的目的就是让开发人员觉得好像是将JAVA对象存储到了数据库里一样。但是,我们知道数据库中只有表,如何将java对象经过Hibernate存储到数据库中,又如何将数据库中存储的数据通过...
  • u010902721
  • u010902721
  • 2016年09月29日 23:08
  • 2334

Hibernate03(无连接表的单项1-N关联)

package com.dt.pojo; import java.util.Set; import javax.persistence.Column; import javax.persist...
  • doutao6677
  • doutao6677
  • 2016年06月03日 08:46
  • 258

Hibernate02(单项有连接表N-1)

对于大多数单项N-1关联而言,使用基于外键关联映射已经足够。但是由于底层数据建模时也可以使用连接表来建立这种关系,hibernate也提供了这种支持。 @JoinTable专门用于映射底层连接表信息 ...
  • doutao6677
  • doutao6677
  • 2016年06月02日 09:01
  • 149

Hibernate 关系映射(6) 基于中间表关联的单向1:N

基于中间表关联的单向1:N 单向 1 对 N 关联,注意 和 N:1 是相反的 想象下: 吃大锅饭的时候 ,就是很多人住一个地方,一个房间,一个大炕上 eg:  一个地方有多个人住.或者说 多家...
  • luobing_csdn
  • luobing_csdn
  • 2017年03月27日 11:16
  • 472

Hibernate04(无连接表的双向1-N关联)

package com.dt.pojo; import java.util.HashSet; import java.util.Set; import javax.persist...
  • doutao6677
  • doutao6677
  • 2016年06月03日 09:11
  • 297

Hibernate 第十讲 表关联关系(一)单项一对一外键关联

一:annotation配置方式 package com.darren.relation.model;   import javax.persistence.Entity; import javax...
  • zpf336
  • zpf336
  • 2013年03月04日 22:06
  • 276

hibernate练习之单项关联一对多

实体类package cn.oneToMany; import java.io.Serializable; /** * 学生 * @author Administrator * */ pub...
  • shehun11
  • shehun11
  • 2014年09月02日 17:04
  • 339

【Hibernate三】关系映射之一对多单项关联

在一的一方的类中,添加一个集合,用来保存多的一方的对象!数据库在操作一的一方的时候,会联动操作多的一方! 班级和学生的关系!一个班级有多名学生,一个学生只属于一个班级,这是典型的一对多! ...
  • damogu_arthur
  • damogu_arthur
  • 2015年07月17日 11:10
  • 260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate01(无表关联的单项N-1)
举报原因:
原因补充:

(最多只允许输入30个字)