Hibernate映射之OneToOne(第二篇)

这是在项目中实际遇到的一个问题,纠结了很久。一开始参考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);
 
原文地址:https://www.cnblogs.com/ChenJunHacker/p/4501057.html