这是在项目中实际遇到的一个问题,纠结了很久。一开始参考mkyong的 ,两边都写OneToOne ,后来查看了一下项目经理在原来一些模块中的写法。 学习一下:

首先是E-R图:  一个货品可以进行多次调价。调价记录保存在productPrice表里面。

而Product表保存了最新一次调价的productPrice_id .第一次见这种表设计,感觉很怪。

Product类:

package net.myspring.blue.modules.crm.entity;

import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient; import org.junit.Ignore; import net.myspring.blue.common.persistence.DataEntity; @Entity
@Table(name="crm_product")
@Cacheable
public class Product extends DataEntity {
private String name;
private String namePinyin;
private Brand brand; //manyToOne
private ProductPrice productPrice;
private Long brandId; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getNamePinyin() {
return namePinyin;
} public void setNamePinyin(String namePinyin) {
this.namePinyin = namePinyin;
} @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "brand_id")
public Brand getBrand() {
return brand;
} public void setBrand(Brand brand) {
this.brand = brand;
} @Ignore
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="product_price_id")
public ProductPrice getProductPrice() {
return productPrice;
} public void setProductPrice(ProductPrice productPrice) {
this.productPrice = productPrice;
}
@Transient
public Long getBrandId() {
if(brandId==null && brand!=null) {
brandId=brand.getId();
}
return brandId;
} public void setBrandId(Long brandId) {
this.brandId = brandId;
} }

ProductPrice类:

package net.myspring.blue.modules.crm.entity;

import java.math.BigDecimal;

import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table; import net.myspring.blue.common.persistence.DataEntity; @Entity
@Table(name="crm_product_price")
@Cacheable
public class ProductPrice extends DataEntity{
private BigDecimal oldPrice;
private BigDecimal newPrice;
private Product product; //ManyToOne public ProductPrice(BigDecimal oldPrice,BigDecimal newPrice,Product product){
this.oldPrice=oldPrice;
this.newPrice=newPrice;
this.product=product;
}
public ProductPrice(){
} public BigDecimal getOldPrice() {
return oldPrice;
} public void setOldPrice(BigDecimal oldPrice) {
this.oldPrice = oldPrice;
} public BigDecimal getNewPrice() {
return newPrice;
} public void setNewPrice(BigDecimal newPrice) {
this.newPrice = newPrice;
} @ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="product_id")
public Product getProduct() {
return product;
} public void setProduct(Product product) {
this.product = product;
} }
注意Product和ProductPrice表之间的映射注解:
product.productPrice是这样的
  @OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="product_price_id")
public ProductPrice getProductPrice() {
return productPrice;
}

而productPrice.product是这样的:

  @ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="product_id")
public Product getProduct() {
return product;
}
持久化操作:
productPriceDao.save(productPrice); //先save  productPrice?有点看不懂
product.setProductPrice(productPrice); 

productDao.save(product);
 

Hibernate映射之OneToOne(第二篇)的更多相关文章

  1. hibernate映射文件one-to-one

    one-to-one 元素 属性: name:映射类属性的名字 class:映射的目标类 cascade:设置操作中的级联策略 可选值为 all所有操作情况均进行级联.none所有操作情况均不进行级联 ...

  2. 【SSH系列】hibernate映射 -- 一对一双向关联映射

    开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...

  3. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  4. Hibernate —— 映射关联关系

    一.映射多对一关联关系. 1.单向的多对一 (1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户.从 Order 到 Customer 是多对一关联关 ...

  5. Hibernate映射文件如何配置触发器

    Hibernate映射文件之触发器生成(generated属性.database-object元素) (2013-02-27 12:28:49) 转载▼ 标签: it 分类: JAVA学习笔记 这里分 ...

  6. hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系

    hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持 ...

  7. 第二篇 Integration Services:SSIS数据泵

    本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...

  8. 第二篇 SQL Server安全验证

    本篇文章是SQL Server安全系列的第二篇,详细内容请参考原文. 验证是检验主体的过程.主体需要唯一标识,那样SQL Server可以确定主体有哪些权限.正确的验证是提供安全访问数据库对象的必要的 ...

  9. Hibernate映射解析——七种映射关系

    首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对 ...

随机推荐

  1. sudo用户管理

    合理分配用户权限 分配方法-sudo /etc/sudoers 用户名 主机名=(运行用户名) 可运行的命令 例1 smb ALL=(ALL) /usr/sbin/useradd 例2 smb ALL ...

  2. scp远程复制

    scp 源 目标 -r 复制目录 scp -r  root@ip:/XXX/path  /XXX 注意:复制目录,包括该目录本身,目的地址无需再加该目录

  3. 洛谷P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...

  4. 使用apache-jMeter出现乱码问题。

    服务器字符(utf-8)正常,但是在使用apache-jMeter的时候,得到的数据会乱码.所以我们需要设置jmeter的字符编码.默认为ISO-8859-1. 进入jmeter.bat文件夹,有个j ...

  5. Substance 6 设置 watermark(水印)

    http://www.qumake.com/articles/2011/04/18/1303094833690.html ——————————————————————————————————————— ...

  6. 第19章 queue队列容器

    /* 第19章 queue队列容器 19.1 queue技术原理 19.2 queue应用基础 19.3 本章小结 */ // 第19章 queue队列容器 // 19.1 queue技术原理 // ...

  7. 添加图片按钮-UI界面编辑器(SkinStudio)教程

    打开工具箱,选择Button控件 在窗体上添加一个Button控件 给Button控件的ImageNormal属性添加图片 添加完成后的效果 删除Text属性的值(即删除显示的文本)

  8. 如何用expdp、impdp按表空间导出、导入?

    参考:http://blog.csdn.net/zftang/article/details/6387325 A数据库: 表空间:ylcois 用户名:ylcois 密码:ylcois B数据库: 表 ...

  9. SilverLight - Memory Leak

    There is a memory leak issue in current silverlight project. It occurs in the search function: the m ...

  10. confirm确认对话框

    还记得之前的javascript入门里的讲的confirm 消息对话框吗?不记得也没关系,我们先来回顾一下,然后在详细讲它. 复习: confirm 消息对话框通常用于允许用户做选择的动作,如:“你对 ...