先构建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);