工作中遇到的问题--Hibernate注解添加在一方和多方的区别

以Good和GoodStatus为例:

一、注解仅添加在一方:

@Entity
@Table(name = "GOOD")
@Where(clause="enabled=1") //Used for logical delete, disabled objects are always hidden
public class Good extends AMfgObject implements Serializable {

/** serialVersionUID */
    private static final long serialVersionUID = -7656499731749432022L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "GOOD_ID", nullable = false)
    private Long id;

@OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    private Set<GoodStatus> goodStatus;
    /**
     * Empty constructor
     */
    public Good(){}
     
    public Long getId() {
        return id;
    }

public void setId(Long id) {
        this.id = id;
    }

public Set<GoodStatus> getGoodStatus() {
        return goodStatus;
    }

public void setGoodStatus(Set<GoodStatus> goodStatus) {
        this.goodStatus = goodStatus;
    }

/**
     * add GoodStatus directly
     * @param goodStatus
     */
    public void addGoodStatus(GoodStatus goodStatus){
        this.goodStatus.add(goodStatus);             
        /*goodStatus.setGood(this);*/              //如果在多方也有注解则需添加这句,否则不能级联保存更新
    }
}

在多方不加一方的映射(即不加Good good;这个属性)

@Entity
@Table(name = "GOODSTATUS")
@Where(clause = "enabled=1")
public class GoodStatus extends AMfgObject implements Serializable {
    /**
     *
     */
    private static final long serialVersionUID = -1279190303132720639L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", nullable = false)
    private Long id;

@Column(name = "VALUE")
    private String value;

public GoodStatus() {
        super();
    }

public String getValue() {
        return value;
    }

public void setValue(String value) {
        this.value = value;
    }
    public Long getId() {
        return id;
    }

public void setId(Long id) {
        this.id = id;
    }
}

这种情况下生成的SQL语句是这样的:

CREATE TABLE good (
  good_id bigint(20) NOT NULL auto_increment,
  PRIMARY KEY  (good_id)
) ;
-- create table goodstatus
CREATE TABLE goodstatus (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  value varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (ID)
);
--good_good_status
CREATE TABLE good_good_status (
  good_GOOD_ID bigint(20) NOT NULL,
  good_status_id bigint(20) NOT NULL,
  PRIMARY KEY (good_GOOD_ID,good_status_id),
  KEY FK_GOOD_ID (good_GOOD_ID),
  KEY FK_GOOD_STATUS_ID (good_status_id)
);

生成了三个表,类似于manytomany

二、注解仅添加在多的一方,则与双方都添加注解相同,仅生成两个表:

Good对应表不变,GoodStatus表

SQL语句对应如下:

-- create table goodstatus
CREATE TABLE goodstatus (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  value varchar(255) COLLATE utf8_unicode_ci NOT NULL,

good_id bigint(20) DEFAULT NULL,
  PRIMARY KEY (ID),

CONSTRAINT FK_GOOD_ID FOREIGN KEY (good_id) REFERENCES GOOD(ID)
);

时间: 2024-10-26 06:36:59

工作中遇到的问题--Hibernate注解添加在一方和多方的区别的相关文章

工作中遇到的问题--Hibernate一对多保存简化Service层代码

在创建一方的entity是添加一个增加多方的方法: package com.sim.mfg.data.domain; import java.io.Serializable;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.Set; import javax.persistence.CascadeType;import javax.persistence.Column;impo

Myeclipse中基于springMVC+spring+hibernate的非注解入门实例

一直做Android前端开发,想学学后台J2EE服务器开发 的知识,零基础第一步学习一个简单例子: 一, demo结构: 数据库: 二, SpingMVC框架: 拷贝相应的jar到lib纹路下: 三, 在myeclipse中添加Spring支持: 右键点击该工程,在对话框中选择"MyEclipse->Add Spring Capabilities...",添加Spring,并进行相关配置,如图4所示,采用默认配置即可.本例选用的spring3.1. 配置Hibernate 1)右

hibernate中1对1的注解配置

hibernate中1对1的注解配置分为:外键关联映射和主键关联映射 1.外键配置 //一方@Entity@Table(name="test_classinfo")public class ClassInfo { @Id @SequenceGenerator(name="seqClassInfo",sequenceName="seq_test_classinfo") @GeneratedValue(generator="seqClass

SHOP++ 中Hibernate 注解 用法

最近接触到一款JAVA开源软件(shop++)这是一款电商软件.然后看了这款软件的源代码,发现真的很强大.框架采用的是spring mvc + hibernate + freemarker ,代码结构层次分明,代码封装和重用性也很高.非常适合二次开发.其次重点说说hibernate 注解吧 数据库表采用的是hibernate注解映射的方式.然后略微研究了下,分享一下自己的见解. @Entity说明此类是一个实体映射 @Tabletable用来定义entity主表的name,cataloh,sch

(转)Hibernate注解使用以及Spring整合

原文转自:http://wanqiufeng.blog.51cto.com/409430/484739 (1)简介:在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准.它非常强大.灵活,而且具备了优异的性能.在本文中,我们将了解如何使用Java 5 注释来简化Hibernate代码,并使持久层的编码过程变得更为轻松.传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载.    在最近发布的几个Hib

hibernate注解

慕课网:http://www.imooc.com/learn/524 一.类级别注解 简介 使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置 JPA(Java Persistence API)与hibernate的关系:JPA是标准接口,hibernate是实现(hibernate的功能是jpa的超集,功能更强大) hibernate如何实现与JPA的关系:通过hibernate-annotation.hibernate-entitymanager.hibernate-core三

(十) 使用Hibernate 注解

Hibernate里有两种注解 : Hibernate 注解 JPA注解 主键生成机制 : http://www.cnblogs.com/ph123/p/5692194.html 案例一:   用注解对非复合主键的表生成配置文件 package bean; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.p

Hibernate注解方法使用总结

1.类级别注解 @Entity     映射实体类 @Table    映射数句库表 @Entity(name="tableName") - 必须,注解 将一个类声明为一个实体bean. 属性: name - 可选,对应数据库中的一个表.若表名与实体类名相同,则可以省略. @Table(name="",catalog="",schema="")  - 可选,通常和@Entity 配合使用,只能标注在实  体的 class 定义

hibernate注解解析

最近学习hibernate注解形式配置POJO类,将注解的解析记下来,以备以后使用. 例1. @Entity@Table(name="user")  public class Flight implements Serializable {    Long id; @Id @GeneratedValue(generator="generator") @GenericGenerator(name="generator", strategy = &q