`
woshixushigang
  • 浏览: 575770 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

hibernate4注解配置,纠结的一对多双向关联

 
阅读更多

目前负责中行风险管理系统的数据核对加工模块,业务以及逻辑都已经梳理好了,但是实施的时候遇到了点问题,hibernate注解配置问题。闲话不多说直接上正确的配置:

 

package com.ibm.banking.irmp.dataimport;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.NamedQueries;
import org.hibernate.annotations.NamedQuery;

import com.ibm.banking.framework.dto.BaseVO;

@Entity
@Table(name = "RI_NT_REGULAR_DEF")
@NamedQueries({ @NamedQuery(name = "RegularTable.getAll", query = "select regularData from RegularData regularData  order by regularData.id", readOnly = true, cacheable = true, cacheRegion = "RefBean") })
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = "RefBean")
public class RegularData implements BaseVO, Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5395568085328896385L;
	/**
	 * @author xushigang
	 */
	private Long id;
	private String tableName;
	private List<RegularColMapping> mapping;

	public RegularData() {
	}

	public RegularData(Long tableId) {
		super();
		this.id = tableId;
	}

	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}


	@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
	@JoinColumn(name="table_id")
	public List<RegularColMapping> getMapping() {
		return mapping;
	}

	public void setMapping(List<RegularColMapping> mapping) {
		this.mapping = mapping;
	}
}

 

package com.ibm.banking.irmp.dataimport;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import com.ibm.banking.framework.dto.BaseVO;

@Entity
@Table(name = "RI_NT_REGULAR_COL")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = "RefBean")
public class RegularColMapping implements BaseVO, Serializable {
	/**
	 * @author xushigang
	 */
	private static final long serialVersionUID = 1L;
	private Long id;
	private String regularName;
	private String description;
	private String regularType;
	private String columnName;
	private String sql;
	private String tag;
	private RegularData regularData;
	
	public RegularColMapping() {}
	public RegularColMapping(String columnName) {
		super();
		this.columnName = columnName;
	}
	@Id @GeneratedValue
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getRegularName() {
		return regularName;
	}
	public void setRegularName(String regularName) {
		this.regularName = regularName;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public String getRegularType() {
		return regularType;
	}
	public void setRegularType(String regularType) {
		this.regularType = regularType;
	}
	public String getColumnName() {
		return columnName;
	}
	public void setColumnName(String columnName) {
		this.columnName = columnName;
	}
	public String getSql() {
		return sql;
	}
	public void setSql(String sql) {
		this.sql = sql;
	}
	public String getTag() {
		return tag;
	}
	public void setTag(String tag) {
		this.tag = tag;
	}
	
	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="table_id")
	public RegularData getRegularData() {
		return regularData;
	}
	public void setRegularData(RegularData regularData) {
		this.regularData = regularData;
	}
	
}
 
@Test
	public void testRegular(){
		//List<Object[]> o = session.createQuery(sql.toString()).list();
		//StringBuffer sb = new StringBuffer();
		//sb.append(Restrictions.in("tableId", new String[]{"1","2","3"}));
		//sb.append(Restrictions.ilike("mapping.regularName","aa", MatchMode.ANYWHERE));
		//System.out.println(sb.toString());
		//System.out.println(o.get(0)[0]);
		//System.out.println(o.get(0)[1]);
		//session.enableFilter("a");
		Session session= dao.getSession();
		//List<RegularData> rd = session.createQuery("from RegularData rd").list();
		List<RegularColMapping> mapping = new ArrayList<RegularColMapping>();
		RegularData tf = new RegularData();
		tf.setTableName("RI_NT_SYS_FUNC");
		RegularColMapping rc = new RegularColMapping();
		rc.setColumnName("column_name");
		rc.setSql("sql");
		//rc.setRegularData(tf);
		mapping.add(rc);
		RegularColMapping rc1 = new RegularColMapping();
		rc1.setColumnName("column_name");
		rc1.setSql("sql");
		//rc1.setRegularData(tf);
		mapping.add(rc1);
		tf.setMapping(mapping);
		session.save(tf);
		
	}

 

以上配置是正确的,多的一端会自动生成table_id 并且会自动插入数值。

 

按照常规的配置:

 

@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true,mappedBy="regularData")
	
	public List<RegularColMapping> getMapping() {
		return mapping;
	}

 这样的话table_id就会插入 null 需要手工 关联!!!

 

测试结果如下:

Hibernate: 
    select
        hibernate_sequence.nextval 
    from
        dual
Hibernate: 
    select
        hibernate_sequence.nextval 
    from
        dual
Hibernate: 
    select
        hibernate_sequence.nextval 
    from
        dual
Hibernate: 
    insert 
    into
        ri_nt_regular_def
        (table_name, id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        ri_nt_regular_col
        (column_name, description, table_id, regular_name, regular_type, sql, tag, id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        ri_nt_regular_col
        (column_name, description, table_id, regular_name, regular_type, sql, tag, id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)

 

 

分享到:
评论

相关推荐

    Hibernate ORM - 一对多双向关联关系

    描述部分为空,但我们可以根据标题推测,这篇博客可能详细解释了如何在Hibernate中配置和管理这种一对多双向关联,包括XML配置、注解方式,以及如何在代码中进行操作和查询。 **Hibernate ORM简介** Hibernate是一...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    Hibernate关于注解的一对多,多对多,一对一

    本篇文章将深入探讨Hibernate中注解的一对多、多对多和一对一关系映射。 ### 一对多关系 在现实生活中,例如一个班级有一个班主任,而班主任可以管理多个学生,这就是典型的“一对多”关系。在Hibernate中,我们...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    hibernate多对多双向关联

    "hibernate_many2many_2"这个文件名可能是指一个关于Hibernate多对多关联的示例或教程的第二部分,可能包含配置文件、Java实体类、映射文件以及相关的测试代码。 **详细知识点:** 1. **实体类定义**:在Hibernate...

    Hibernate一对多双向自身关联demo代码

    在这个“Hibernate一对多双向自身关联demo代码”中,我们将深入理解如何实现一个实体类与其自身进行一对多的双向关联。这种关联在实际应用中常见于例如用户的朋友关系、员工的上下级关系等场景。 首先,让我们了解...

    Hibernate一对一主键关联映射(双向关联)

    双向一对一关联的好处在于简化了代码,提高了可读性和可维护性。开发人员可以从任一侧直接获取关联的对象,无需额外的查询操作。然而,需要注意的是,由于这种关联是双向的,所以在处理关联关系时,要特别注意同步两...

    Hibernate4.0注解配置详解.docx

    Hibernate4.0注解配置详解,Hibernate4.0注解配置详解,Hibernate4.0注解配置详解

    Hibernate一对多关联映射(注解)

    总结一下,Hibernate的一对多关联映射通过注解方式定义了对象间的关联关系,使得我们在编程时能够以面向对象的方式操作数据,而底层数据库的操作则由Hibernate自动完成。这种方式大大提高了开发效率,同时也降低了...

    hibernate外键实现一对一双向关联关系源码

    在实际应用中,确保在两个实体类间的一对一关联正确无误非常重要。在创建和更新关联时,应避免循环引用和数据不一致的问题。在保存或更新对象时,需确保在双方都进行了正确的设置。 8. **性能考虑**: 一对一双向...

    Hibernate ORM - 一对多双向连接表关联关系

    虽然描述部分为空,但根据标题,我们可以推断这篇文章可能详细介绍了如何在Hibernate中设置和管理一对多双向关联,包括配置XML映射文件、注解或者使用Java配置,以及如何在代码中处理这种关联关系。 **标签解析:**...

    Hibernate一对一,一对多,多对多实例

    在Hibernate中,可以通过`@ManyToMany`注解定义多对多关系,并使用`@JoinTable`定义连接表。例如,Student实体和Course实体的多对多关系: ```java @Entity public class Student { @ManyToMany @JoinTable...

    Hibernate Annotation 共享主键一对一双向关联

    在实际的项目开发中,我们经常遇到各种各样的关联关系,比如一对一、一对多、多对一、多对多等。本文将详细讲解“Hibernate Annotation 中的共享主键一对一双向关联”。 首先,我们需要理解什么是共享主键(Shared ...

    hibernate 多对多全注解(单向关联、双向关联)

    hibernate关联映射注解多对多单向关联、

    Hibernate一对一唯一外键关联映射(双向关联)

    在Hibernate中,一对一关联可以通过配置XML映射文件或使用注解来实现。这里我们将使用注解方式进行说明。首先,我们需要在两个实体类中分别定义对应的属性,并使用`@OneToOne`注解来指定关联关系。 1. 实体类A: ``...

Global site tag (gtag.js) - Google Analytics