以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)
);

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

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

    在创建一方的entity是添加一个增加多方的方法: package com.sim.mfg.data.domain; import java.io.Serializable;import java.u ...

  2. hibernate中1对1的注解配置

    hibernate中1对1的注解配置分为:外键关联映射和主键关联映射 1.外键配置 //一方@Entity@Table(name="test_classinfo")public c ...

  3. Hibernate 注解中CascadeType用法汇总

    这两天,参加一个课程设计,同时这个项目又作为一个模块镶嵌到其他项目中,考虑如此,应与原先的架构相同,因牵扯到留言和相互@功能,故数据库之间OneToOne,OneToMany,ManyToMany之风 ...

  4. Hibernate注解使用以及Spring整合

    Hibernate注解使用以及Spring整合 原文转自:http://wanqiufeng.blog.51cto.com/409430/484739 (1) 简介: 在过去几年里,Hibernate ...

  5. hibernate注解方法使用总结(转)

    原博文地址:http://blog.sina.com.cn/s/blog_935ebb670101dnre.html 1.类级别注解 @Entity     映射实体类 @Table    映射数据库 ...

  6. Hibernate注解

    前言: 最近正在学习Hibernate通过注解(annotation)来管理映射关系,以前都是通过XML映射文件.下面拿个小例子说一下. 数据库物理模型: 数据库的描述: 一篇博客随笔可以分到不同的类 ...

  7. hibernate 注解 主键生成策略

    一.JPA通用策略生成器       通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...

  8. Hibernate 注解的用法以及说明

    1.类级别注解 @Entity     映射实体类 @Table    映射数句库表  @Entity(name="tableName") - 必须,注解将一个类声明为一个实体be ...

  9. Hibernate注解映射联合主键的三种主要方式

    今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException ...

随机推荐

  1. 最大子段和-Program A

    最大子段和 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description G ...

  2. HDU 1045 - Fire Net (最大独立集)

    题意:给你一个正方形棋盘.每个棋子可以直线攻击,除非隔着石头.现在要求所有棋子都不互相攻击,问最多可以放多少个棋子. 这个题可以用搜索来做.每个棋子考虑放与不放两种情况,然后再判断是否能互相攻击来剪枝 ...

  3. JS 基于面向对象的 轮播图2

    <script> // 函数不能重名, --> 子函数 // is defined function --> 函数名是否写错了 function AutoTab(id) { T ...

  4. 安全增强 Linux (SELinux) 剖析

    架构和实现 Linux® 一直被认为是最安全的操作系统之一,但是通过引入安全增强 Linux(Security-Enhanced Linux,SELinux),National Security Ag ...

  5. Linux下tmpfs与ramfs的区别

      ramfs是Linux下一种基于RAM做存储的文件系统.在使用过程中你就可以把ramfs理解为在普通的HDD上建立了一个文件系统,而现在HDD被替换成了RAM,因为是RAM做存储所以会有很高的存储 ...

  6. (转)Ratchet教程:meta与link标签

    原文:http://www.w3cplus.com/mobile/meta-and-link-tags-for-ratchet.html Ratchet教程:meta与link标签           ...

  7. hive 中 union all

    hive 中的union all是不能在sql语句的第一层使用的,否则会报 Top level UNION is not supported currently 错误: 例如如下的方式: select ...

  8. Android Launcher 详解

    (1)      Launcher的定义:Android系统启动后,加载的第一个程序,是其他应用程序的入口. (2)      Launcher的构成:HomeScreen(1.workspace(A ...

  9. yii2 数据验证

    控制器层 <?php namespace frontend\controllers; use Yii; use frontend\models\FormsModel; use yii\web\U ...

  10. Activity与Service通信(不同进程之间)

    使用Messenger 上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger. 其实实现IPC(Inter-Process Communicat ...