这是在项目中实际遇到的一个问题,纠结了很久。一开始参考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. 全局修改Lable/Button字体

    本次版本需求要把原来的字体全改掉,由于项目中有的是代码创建的,有的是XIB中直接改的,一个一个改工作量太大,使用运行时可以很轻松的实现        首先,项目中大多数设置字体的控件有 Lable, ...

  2. c语言 sscanf()函数

    sscanf()函数用于从字符串中读取指定格式的数据,其原型如下:    int sscanf (char *str, char * format [, argument, ...]); [参数]参数 ...

  3. java之注解Annotation

    元注解:负责注解其他注解,java5提供的4个meta-annotation元注解 @Target 规定注解修饰的范围 ElementType.CONSTRUCTOR:构造器声明 ElementTyp ...

  4. Extract QQ from iPhone and analyze it

    QQ is one of the most popular chat App in the world. Now let me show you how to extract QQ from iPho ...

  5. 【EF学习笔记10】----------主从表级联操作

    主从表 级联新增 Console.WriteLine("=========主从表 级联新增=========="); using (var db = new Entities()) ...

  6. java 枚举类 enum 总结

    枚举定义: enum是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量 ...

  7. 你还没成为Delphi QC的成员吗?(转红鱼儿)

    Delphi很早就建立了quality.embarcadero.com,简称为QC,质量控制中心,用来接收用户反馈的bug,新功能建议等,是开发者与delphi官方直接交流的平台.无论是否为正版用户, ...

  8. java基础知识点复习

    第一天: JRE.JDK是什么? Jre java运行环境.Jre = java虚拟机+核心类库(辅助java运行的文件) Jdk:java开发工具集jdk = jre+java的开发工具 2. 配置 ...

  9. MS sql server 基础知识回顾(二)-表连接和子查询

    五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...

  10. JAVA课程实验报告 实验三 敏捷开发与XP实践

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...