您的位置:首页 > 其它

one to many的注意点

2015-08-09 14:30 465 查看
先构建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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: