Hibernate4关系映射总结

来源:互联网 发布:pkpm软件 编辑:程序博客网 时间:2024/06/04 09:12
--------------------------------------------无表关联双向1-N--------------------------------------------
User 1少的一端,Order N多的一端


--------User实体类
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;
//mappedBy="person"属性表明该Person实体不控制关联关系
    @OneToMany(targetEntity=Order.class,mappedBy="user") //定义user实体关联的Order实体
private Set<Order> orders = new HashSet<>();




---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;
//定义Order实体关联的User实体
@ManyToOne(targetEntity=User.class)
@JoinColumn(name="user_id",referencedColumnName="id",nullable=false)
@Cascade(CascadeType.ALL) //级联策略 所有持久化都级联到关联的实体 总有级联操作都在order控制
private User user;




-------------------------------------无表关联的单项N-1-----------------------------------------------


---------User实体类
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;


---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;
@ManyToOne(targetEntity=User.class) //定义order实体关联的user实体
@JoinColumn(name="user_id",nullable=false) //映射外键关联。指定外键列的列名是user_id
@Cascade(CascadeType.ALL) //级联策略 所有持久化都级联到关联的实体(级联关系控制在Order) 执行的sql语句或最后出现 update user 查看user实体是否存在
private User user;










-------------------------------------有表关联的单项N-1-----------------------------------------------产生中间表(order_user)连接user和order


---------User实体类
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;


---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;


@ManyToOne(targetEntity=User.class) //定义Order实体关联的User实体
    @JoinTable(name="order_user",//指定连接表的表名为order_user(连接表指的是中间表)
    //指定连接表中的order_id为外键(存在于中间表),参照到实体对应表的主键列 (id是t_order表的主键列)
    joinColumns=@JoinColumn(name="order_id",referencedColumnName="id",unique=true),
    //指定连接表中的user_id外键列(存在于中间表),参照到当前实体的关联实体对应表的主键列(id是t_user表的主键列)
    inverseJoinColumns=@JoinColumn(name="user_id",referencedColumnName="id"))
private User user;




-------------------------------------(无连接表的单项1-N关联)-----------------------------------------------
无连接表的单项1-N关联,因为1的一端需要访问N的一端,而且N的一端将以集合Set形式表示
 * 程序是需要在N的一端增加一个外键列来维护关系,因为是由1的一端来控制关联关系,因此直接在1的一端用@JoinColumn修饰Set集合映射外键列即可
---------User实体类
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;

/*
*  1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
* */
@OneToMany(targetEntity=Order.class,fetch=FetchType.EAGER) //定义User实体关联的Order实体
@JoinColumn(name="user_id",referencedColumnName="id") //映射外键关联。指定外键列的列名是user_id
private Set<Order> order;


---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;
----------test
User user = new User();
    user.setUsername("dt");
user.setPassword("123");
    user.setEmail("dskdks@qq.com");
    user.setSex(2);
userService.saveUser(user); 

Order order = new Order();
order.setCtimes("2016-06-11");
order.setOrderName("商品3");
orderService.saveOrder(order);


-------------------------------------无连接表的双向项1-N关联-----------------------------------------------
---------User实体类


@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;

/*
*  1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
* */
@OneToMany(targetEntity=Order.class,mappedBy="user",cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.EAGER) //定义User实体关联的Order实体
private Set<Order> order= new HashSet<>();


---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;
@ManyToOne(targetEntity=User.class)
@JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
private User user;


---------test
     User user =new User();
    user.setUsername("ee");
    user.setPassword("123");
    user.setEmail("dskdks@qq.com");
    user.setSex(2);
userService.saveUser(user); 

Order order = new Order();
order.setCtimes("2016-06-11");
order.setOrderName("商品21");
order.setUser(user);
orderService.saveOrder(order);

Order order2 = new Order();
order2.setCtimes("2016-06-11");
order2.setOrderName("商品21");
order2.setUser(user);
orderService.saveOrder(order2);











0 0
原创粉丝点击