Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]
2020-11-24 10:52
标签:style blog class code java ext 1、项目结构: 1.1、场景说明: 一个订单,包含多个产品 1.2、类文件: Order.java order.hbm.xml Product.java product.hbm.xml hibernate.cfg.xml 1.3 、结论: 在Many方 定义XML配置 : 写入数据调用session.save方法跟单表保存基本一致。 读取数据:获取Many对象,默认
One对象都是以延迟加载模式进行加载。 不论是删除 Many ,还是删除
One 对象 都只删除本身数据
,并非删除全部主从数据,如果删除One对象,一旦Many还有关联One的对象的存在,则将抛出异常。见(test04_del) 1.4 、测试验证: 输出: Hibernate: insert into t_order (Name, SumMoney, createDate) values (?, ?,
?) 输出: Hibernate: select order0_.orderID as orderID1_0_0_, order0_.Name as
Name2_0_0_, order0_.SumMoney as SumMoney3_0_0_, order0_.createDate as
createDa4_0_0_ from t_order order0_ where order0_.orderID=? 输出: -----------Read Product----------- 输出: -------------------------------------------------OneToMany---------------------------------------------------------------------------- >>>
OneToMany 单相关联 2.1
需求背景:
每个人都有很多标签: 在User 类中添加: 同时 添加 Tag类: 添加User对应XML配置: 注意:此处 one-to-many 对应的 class 需要填写类的全路径名称 2.2 验证: 输出: Hibernate: insert into t_tag (tagTitle) values (?)
package
com.rhythmk.model;
import
java.util.Date;
public
class
Order {
public
int
getOrderID() {
return
orderID;
}
public
void
setOrderID(
int
orderID) {
this
.orderID = orderID;
}
public
String getName() {
return
Name;
}
public
void
setName(String name) {
Name = name;
}
public
double
getSumMoney() {
return
SumMoney;
}
public
void
setSumMoney(
double
sumMoney) {
SumMoney = sumMoney;
}
public
Date getCreateDate() {
return
createDate;
}
public
void
setCreateDate(Date createDate) {
this
.createDate = createDate;
}
private
int
orderID;
private
String Name;
private
double
SumMoney;
@Override
public
String toString() {
return
"Order [orderID="
+ orderID +
", Name="
+ Name +
", SumMoney="
+ SumMoney +
", createDate="
+ createDate +
"]"
;
}
private
Date createDate;
}
xml version="1.0" encoding="utf-8"?>
DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
hibernate-mapping>
class name="com.rhythmk.model.Order" table="t_order">
id name="orderID" type="int">
column name="orderID" />
generator class="native" />
id>
property name="Name" type="string">
column name="Name" not-null="true" />
property>
property name="SumMoney" type="double">property>
property name="createDate" type="timestamp">
column name="createDate" not-null="true" />
property>
class>
hibernate-mapping>
package
com.rhythmk.model;
public
class
Product {
public
int
getProductID() {
return
productID;
}
public
void
setProductID(
int
productID) {
this
.productID = productID;
}
public
String getProductName() {
return
productName;
}
public
void
setProductName(String productName) {
this
.productName = productName;
}
private
int
productID;
private
String productName;
public
Order getOrder() {
return
order;
}
public
void
setOrder(Order order) {
this
.order = order;
}
private
Order order ;
@Override
public
String toString() {
return
"Product [productID="
+ productID +
", productName="
+ productName +
", order="
+ order +
"]"
;
}
}
xml version="1.0" encoding="utf-8"?>
DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
hibernate-mapping>
class name="com.rhythmk.model.Product" table="t_product">
id name="productID" type="int">
column name="productID" />
generator class="native" />
id>
property name="productName" type="string">
column name="productName" />
property>
many-to-one name="order" column="orderID">many-to-one>
class>
hibernate-mapping>
xml version=‘1.0‘ encoding=‘UTF-8‘?>
DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
hibernate-configuration>
session-factory>
property name="dialect">org.hibernate.dialect.MySQLDialectproperty>
property name="connection.url">jdbc:mysql://localhost:3306/hibernate_demoproperty>
property name="connection.username">rootproperty>
property name="connection.password">wangkunproperty>
property name="connection.driver_class">com.mysql.jdbc.Driverproperty>
property name="myeclipse.connection.profile">com.mysql.jdbc.Driverproperty>
property name="hibernate.show_sql">true property>
property name="hibernate.hbm2ddl.auto">updateproperty>
mapping resource="com/rhythmk/model/user.hbm.xml" />
mapping resource="com/rhythmk/model/product.hbm.xml" />
mapping resource="com/rhythmk/model/order.hbm.xml" />
session-factory>
hibernate-configuration>
many-to-one name="order" column="orderID">many-to-one>
@Test
public
void
test02_add() {
Session session =
null
;
try
{
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Order order =
new
Order();
order.setCreateDate(
new
Date());
order.setName(
"订单一"
);
order.setSumMoney(
12
);
session.save(order);
Product p1 =
new
Product();
p1.setOrder(order);
p1.setProductName(
"产品1"
);
session.save(p1);
Product p2 =
new
Product();
p2.setOrder(order);
p2.setProductName(
"产品2"
);
session.save(p2);
session.getTransaction().commit();
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
if
(session !=
null
)
session.close();
}
}
Hibernate: insert into t_product (productName, orderID) values (?,
?)
Hibernate: insert into t_product (productName, orderID) values (?, ?)
@Test
public
void
test03_load() {
Session session =
null
;
try
{
session = HibernateUtil.getSessionFactory().openSession();
Order order = (Order) session.load(Order.
class
,
1
);
System.out.println(order);
System.out.println(
"-----------Read Product-----------"
);
Product product = (Product) session.load(Product.
class
,
1
);
System.out.println(
"-----------Print Product-----------"
);
System.out.println(product);
System.out.println(
"-----------Read Order-----------"
);
System.out.println(product.getOrder().getName());
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
if
(session !=
null
)
session.close();
}
}
Order [orderID=1,
Name=订单一, SumMoney=12.0, createDate=2014-05-02 15:24:02.0]
-----------Read
Product-----------
-----------Print Product-----------
Hibernate: select
product0_.productID as productI1_1_0_, product0_.productName as productN2_1_0_,
product0_.orderID as orderID3_1_0_ from t_product product0_ where
product0_.productID=?
Product [productID=1, productName=产品1, order=Order
[orderID=1, Name=订单一, SumMoney=12.0, createDate=2014-05-02
15:24:02.0]]
-----------Read Order-----------
订单一
@Test
public
void
test04_Get() {
Session session =
null
;
try
{
session = HibernateUtil.getSessionFactory().openSession();
System.out.println(
"-----------Read Product-----------"
);
Product product = (Product) session.get(Product.
class
,
1
);
System.out.println(
"-----------Print Product-----------"
);
System.out.println(product);
System.out.println(
"-----------Read Order-----------"
);
System.out.println(product.getOrder().getName());
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
if
(session !=
null
)
session.close();
}
}
Hibernate: select product0_.productID
as productI1_1_0_, product0_.productName as productN2_1_0_, product0_.orderID as
orderID3_1_0_ from t_product product0_ where
product0_.productID=?
-----------Print Product-----------
Hibernate:
select order0_.orderID as orderID1_0_0_, order0_.Name as Name2_0_0_,
order0_.SumMoney as SumMoney3_0_0_, order0_.createDate as createDa4_0_0_ from
t_order order0_ where order0_.orderID=?
Product [productID=1,
productName=产品1, order=Order [orderID=1, Name=订单一, SumMoney=12.0,
createDate=2014-05-02 15:24:02.0]]
-----------Read
Order-----------
订单一
@Test
public
void
test04_Del() {
Session session =
null
;
try
{
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
/*
Product product = (Product) session.get(Product.class, 1);
session.delete(product);
输出:
Hibernate: select product0_.productID as productI1_1_0_, product0_.productName as productN2_1_0_, product0_.orderID as orderID3_1_0_ from t_product product0_ where product0_.productID=?
Hibernate: delete from t_product where productID=?
*/
Order order = (Order) session.get(Order.
class
,
3
);
session.delete(order);
session.getTransaction().commit();
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
if
(session !=
null
)
session.close();
}
}
Hibernate: select order0_.orderID as orderID1_0_0_, order0_.Name as
Name2_0_0_, order0_.SumMoney as SumMoney3_0_0_, order0_.createDate as
createDa4_0_0_ from t_order order0_ where order0_.orderID=?
Hibernate: delete
from t_order where orderID=?
org.hibernate.exception.ConstraintViolationException:
could not execute statement
at
org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72)
at
org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190)
public
Set
return
tags;
}
public
void
setTags(Set
this
.tags = tags;
}
private
Set
package
com.rhythmk.model;
public
class
Tag {
public
Integer getTagId() {
return
tagId;
}
public
void
setTagId(Integer tagId) {
this
.tagId = tagId;
}
public
String getTagTitle() {
return
tagTitle;
}
public
void
setTagTitle(String tagTitle) {
this
.tagTitle = tagTitle;
}
public
Integer getUserID() {
return
userID;
}
@Override
public
String toString() {
return
"Tag [tagId="
+ tagId +
", tagTitle="
+ tagTitle +
", userID="
+ userID +
"]"
;
}
public
void
setUserID(Integer userID) {
this
.userID = userID;
}
private
Integer tagId;
private
String tagTitle;
private
Integer userID;
}
set name="tags">
key column="userID">key>
one-to-many class="com.rhythmk.model.Tag" />
set>
@Test
public
void
test01_add() {
Session session =
null
;
try
{
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Tag t1 =
new
Tag();
t1.setTagTitle(
"tag1"
);
Tag t2 =
new
Tag();
t2.setTagTitle(
"tag2"
);
Set
new
HashSet
tags.add(t1);
tags.add(t2);
User entity =
new
User();
entity.setUserName(
"张飞2222"
);
entity.setCreateTime(
new
Date());
entity.setTags(tags);
session.save(t1);
session.save(t2);
session.save(entity);
session.getTransaction().commit();
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
if
(session !=
null
)
session.close();
}
}
Hibernate: insert into
t_tag (tagTitle) values (?)
Hibernate: insert into t_user (userName,
createTime) values (?, ?)
Hibernate: update t_tag set userID=? where
tagId=?
Hibernate: update t_tag set userID=? where tagId=?
@Test
public
void
test02_get() {
Session session =
null
;
try
{
文章标题:Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]
文章链接:http://soscw.com/essay/22374.html