`
RyanPoy
  • 浏览: 51229 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

hibernate入门使用系列 7-- annotation关系映射篇(中)

阅读更多

这次说说OneToMany和ManyToOne

 

我们的场景是 1个父亲n多个孩子

 

先来看看这中做法:

TestFather.java

package net.paoding.forum.domain;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class TestFather
{
    String          id;
    String          name;
    List<TestChild> children = new ArrayList<TestChild>();

    /**
     * @return the id
     */
    @Id
    public String getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id)
    {
        this.id = id;
    }

    /**
     * @return the name
     */
    public String getName()
    {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name)
    {
        this.name = name;
    }

    /**
     * @return the children
     */
    @OneToMany
    public List<TestChild> getChildren()
    {
        return children;
    }

    /**
     * @param children the children to set
     */
    public void setChildren(List<TestChild> children)
    {
        this.children = children;
    }
}
 

 

TestChild.java

package net.paoding.forum.domain;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class TestChild
{
    String     id;
    String     name;

    /**
     * @return the id
     */
    @Id
    public String getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id)
    {
        this.id = id;
    }

    /**
     * @return the name
     */
    public String getName()
    {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name)
    {
        this.name = name;
    }
}

 

这样子,好像就可以了。那么是的么?我们来看看hib产生的sql

drop table test_child cascade constraints;
drop table test_father cascade constraints;
drop table test_father_children cascade constraints;

create table test_child (
    id varchar2(255 char) not null,
    name varchar2(255 char),
    primary key (id)
);

create table test_father (
    id varchar2(255 char) not null,
    name varchar2(255 char),
    primary key (id)
);

create table test_father_children (
    null_id varchar2(255 char) not null,
    children_id varchar2(255 char) not null,
    unique (children_id)
);


alter table test_father_children 
    add constraint FK2E6E87D5901B7DBB 
    foreign key (null_id) 
    references test_father;

alter table test_father_children 
    add constraint FK2E6E87D58CD0E56B 
    foreign key (children_id) 
    references test_child;

alter table test_user 
    add constraint FKB9A96B58A237D846 
    foreign key (card_id) 
    references test_card;

 oh! My God !它居然又帮我们多创建了一个table。作为关联。太笨了。

 

很明显,这不是我们所需要的。

那我们该如何呢?

 

分享到:
评论
3 楼 RyanPoy 2008-11-12  
由此我个人给出的结论是: 如果想通过hibernate的 po->ddl 这个功能,在ManyToOne的时候,一定要加上OneToMany配合使用。这样子,才能达到预想的效果。
2 楼 RyanPoy 2008-11-12  
接上
总不能放弃吧。再来。这次我们修改一下TestFather.java

package net.paoding.forum.domain;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class TestFather
{
    String          id;
    String          name;
    List<TestChild> children = new ArrayList<TestChild>();

    /**
     * @return the id
     */
    @Id
    public String getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id)
    {
        this.id = id;
    }

    /**
     * @return the name
     */
    public String getName()
    {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name)
    {
        this.name = name;
    }

    /**
     * @return the children
     */
    @OneToMany(mappedBy="father")
    public List<TestChild> getChildren()
    {
        return children;
    }

    /**
     * @param children the children to set
     */
    public void setChildren(List<TestChild> children)
    {
        this.children = children;
    }
}

注意@OneToMany, 我们加上了 mappedBy="father", 这次看看sql吧:
   drop table test_child cascade constraints;
drop table test_father cascade constraints;

create table test_child (
        id varchar2(255 char) not null,
        name varchar2(255 char),
        father_id varchar2(255 char),
        primary key (id)
    );

create table test_father (
    id varchar2(255 char) not null,
    name varchar2(255 char),
    primary key (id)
);

alter table test_child 
        add constraint FK7A81672F268831C6 
        foreign key (father_id) 
        references test_father;

alter table test_user 
    add constraint FKB9A96B58A237D846 
    foreign key (card_id) 
    references test_card;

我的天啊!终于对了。累死了。这么说,难道就没有实现单向的么?只能通过xml配置?hib啊,你还是比较难用。
1 楼 RyanPoy 2008-11-12  
接上。
于是,我们修改代码:
TestChild.java
package net.paoding.forum.domain;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class TestChild
{
    String     id;
    String     name;
    TestFather father;

    /**
     * @return the id
     */
    @Id
    public String getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id)
    {
        this.id = id;
    }

    /**
     * @return the name
     */
    public String getName()
    {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name)
    {
        this.name = name;
    }

    /**
     * @return the father
     */
    @ManyToOne
    public TestFather getFather()
    {
        return father;
    }

    /**
     * @param father the father to set
     */
    public void setFather(TestFather father)
    {
        this.father = father;
    }
}


那么,这次产生的sql呢?
drop table test_child cascade constraints;
drop table test_father cascade constraints;
drop table test_father_children cascade constraints;

create table test_child (
    id varchar2(255 char) not null,
    name varchar2(255 char),
    father_id varchar2(255 char),
    primary key (id)
);

create table test_father (
    id varchar2(255 char) not null,
    name varchar2(255 char),
    primary key (id)
);

create table test_father_children (
    null_id varchar2(255 char) not null,
    children_id varchar2(255 char) not null,
    unique (children_id)
);	

alter table test_child 
    add constraint FK7A81672F268831C6 
    foreign key (father_id) 
    references test_father;

alter table test_father_children 
    add constraint FK2E6E87D5901B7DBB 
    foreign key (null_id) 
    references test_father;

alter table test_father_children 
    add constraint FK2E6E87D58CD0E56B 
    foreign key (children_id) 
    references test_child;

alter table test_user 
    add constraint FKB9A96B58A237D846 
    foreign key (card_id) 
    references test_card;



唉!失望了!?hib真TMD愚蠢。

相关推荐

    Hibernate Annotation入门

    这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java注解的基本概念。注解是一种元数据,它提供了在编译时或运行时处理类、方法和属性的能力。在Hibernate中,注解用于声明实体类...

    Hibernate学习笔记(1-13)

    【Hibernate学习笔记(1-13)】是传智播客李勇的教程,涵盖了...通过这个系列的学习,开发者能够掌握Hibernate的基本使用,包括配置、对象持久化、查询以及高级特性,从而在实际项目中更高效地进行数据库操作。

    5天入门hibernate

    hibernate是Java开发中的一款流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。在"5天入门hibernate"的学习计划中,你将深入理解hibernate的核心概念和基本...

    hibernate3.2中文文档(chm格式)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate初学者很好的资料

    Hibernate 是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了强大的工具来管理和持久化应用程序中的数据。对于初学者来说,理解并掌握Hibernate的关键概念和技术是非常重要的,因为这可以极大地提高开发...

    HibernateAPI中文版.chm

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate+中文文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate的知识总结

    Hibernate是Java领域中一个非常流行的持久化框架,它通过提供对象关系映射(ORM)来简化数据库编程。通过Hibernate,开发者可以使用Java对象操作数据库,而无需编写大量的SQL代码。Hibernate的知识点非常广泛,下面...

    hibernate入门教程

    5. **映射文件(Mapping File)**: `.hbm.xml`文件用于定义实体类与数据库表之间的映射关系,也可以使用注解方式(Annotation)来完成映射。 三、Hibernate配置 在使用Hibernate之前,需要进行一些基本的配置,包括...

    Hibernate中文详细学习文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate O/R Mapping 入门工程包

    在传统的Hibernate配置中,我们通常会使用XML文件(如HbmUser.xml)来定义对象与数据库表的映射关系。例如,文件可能会包含如下内容: ```xml &lt;hibernate-mapping&gt; &lt;/hibernate-mapping&gt; ``` 在这个...

    马士兵hibernate笔记

    在第7课,通过建立基于Annotation的`HelloWorld`示例,读者可以学习到如何利用注解进行对象关系映射配置。 第8课深入解释了O/RMapping(对象关系映射)的概念,包括其定义、Hibernate的创始人、作用、存在的原因,...

    Hibernate 中文 html 帮助文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate学习笔记

    #### 一、HelloWorld与Hibernate入门 - **HelloWorld实践**:初学者应从创建一个简单的Java项目开始,名为`hibernate_0100_HelloWorld`,在此项目中引入`User-library-hibernate`,包含所有必要的jar包,并集成MySQL...

    hibernate_validator_reference_5.1.3.pdf

    入门部分简要介绍了如何在项目中设置和启动Hibernate Validator,包括以下几个小节: - 项目设置(Project setup),包含Unified EL和CDI2的相关内容。 - 应用约束(Applying constraints)。 - 验证约束...

    java学习笔记(文字整理版).doc

    ### Java学习笔记——Java与Hibernate入门精要 #### 一、Java学习笔记概述 本学习笔记旨在帮助初学者系统地掌握Java语言的基础知识,并通过实际案例深入理解Hibernate框架的应用。通过对核心概念和技术点的详细解释...

    hibernate程序

    在 Hibernate 中,我们使用注解来定义实体类及其属性与数据库表的关系。以下是一个简单的实体类示例: ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax....

Global site tag (gtag.js) - Google Analytics