one to many的注意点

先构建maven

1.添加存储库

	<repositories>
		<repository>
			<id>JBoss repository</id>
			<url>http://repository.jboss.org/nexus/content/groups/public/</url>
		</repository>
	</repositories>


2.添加hibernate及数据库驱动

		<!-- MySQL database driver -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.15</version>
		</dependency>
 
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.6.3.Final</version>
		</dependency>
 
		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.12.1.GA</version>
		</dependency>


3.数据库的对应关系

(图以及代码是网上找的)

在stock

	private Set<StockDailyRecord> stockDailyRecords = 
				new HashSet<StockDailyRecord>(0);


在stock_detail

	private Stock stock;


这样可以构成双向映射,双向映射有诸多好处,我们说说如何达到减少sql

在stock

        <set name="stockDailyRecords" table="stock_daily_record" 
				inverse="true" lazy="true" fetch="select">
            <key>
                <column name="STOCK_ID" not-null="true" />
            </key>
            <one-to-many class="com.mkyong.stock.StockDailyRecord" />
        </set>

有两个需要注意的属性设置

inverse

lazy

lazy:没什么好介绍的

 

inverse是决定外键是由谁来维护的,为false则本方,true为对方

当为false时,本方可以维护多的一方,这个显然不是一对多双向映射的好处,试想既然是双向映射,外键油stock_detal的一方维护就可以了,不然insert数据时会多出update外键的sql

那么我们怎么让外键持有者来维护外键呢?

 

先看看stock_detail的映射

        <many-to-one name="stock" class="com.mkyong.stock.Stock" fetch="select">
            <column name="STOCK_ID" not-null="true" />
        </many-to-one>


在看看insert数据时

Stock stock = new Stock();
        stock.setStockCode("7052");
        stock.setStockName("PADINI");
        session.save(stock);
        
        StockDailyRecord stockDailyRecords = new StockDailyRecord();
        stockDailyRecords.setPriceOpen(new Float("1.2"));
        stockDailyRecords.setPriceClose(new Float("1.1"));
        stockDailyRecords.setPriceChange(new Float("10.0"));
        stockDailyRecords.setVolume(3000000L);
        stockDailyRecords.setDate(new Date());
        
        stockDailyRecords.setStock(stock);        
        stock.getStockDailyRecords().add(stockDailyRecords);

        session.save(stockDailyRecords);


由于外键参考必须先存在数据库中,所以我们先插入stock

接着是插入stock_detail,想想stock_detail怎么对应上stock呢?显然是外键,那么油两种方案,熟悉sql的必然知道

1.先插入不带外键的stock_detail,让后用stock对应的stock_details去更新stock_detail表的外键,这个就是inverse为false的情况(开始时外键为空,初学者不要认为外键不可为空)

2.现在站在stock_detail的角度,我们既然知道"我们"是属于那个stock了,这样就可以直接用一条语句插入stock_detail表了,那么怎么让hibernate知道我们已经是属于那个stock的呢,其实是通过上面的

        stockDailyRecords.setStock(stock); 



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值