`
卡拉阿风
  • 浏览: 100853 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate实现双向一对一关系,很黄很暴力的方法

阅读更多
3张表
A表 AID(主键)  bID   cID其他属性略。。。
B表 BID(主键)  aID   cID其他属性略。。。
C表 CID(主键)  aID   bID其他属性略。。。  有点类似关联的表,但又不是

数据库里未设外键
暂且不讨论这张表设计的好坏(数据库表已经设计好了,改动表结构按目前项目来说有点复杂)
hibernate是工具,是拿来用的,所以在项目中是它适应项目,不是项目去适应他。
如果一个项目被工具所累,那是非常糟糕的事情。

主键是通过hibernate自动生成UUID
在A表中,如果它和B表没有关系,则bID设置为-1
因此要求:
能通过任意一张表对其他表一起来查询
但不能相互修改

通常PO中是这样的
public class A {    
  private String aID;    
  private B b;
  private C c;    
  ...
  public void setAID(String aID); {   
    this.aID = aID;   
  }     
  public void setB(B b); {   
    this.b = b;   
  }
  public void setC(C c); {   
    this.c = c;   
  }      
  public String getAID(); {   
    return aID;   
  }     
  public B getB(); {    
    return b;   
  }  
  public C getC(); {    
    return c;   
  }
  ...    
}    


public class B {    
  private String bID;    
  private A a;
  private C c;    
  ...
  public void setBID(String bID); {   
    this.bID = bID;   
  }     
  public void setA(A a); {   
    this.a = a;   
  }
  public void setC(C c); {   
    this.c = c;   
  }      
  public String getBID(); {   
    return aID;   
  }     
  public A getA(); {    
    return b;   
  }  
  public C getC(); {    
    return c;   
  }
  ...    
}  


配置文件里如下
<hibernate-mapping>
    <class name="com.pojo.A" table="A">
        <id name="aID" type="java.lang.String">
            <column name="AID" length="32" />
            <generator class="assigned" />
        </id>
        ...
        <one-to-one name="b" class="com.pojo.B" 
        	property-ref="a" />
     </class>
</hibernate-mapping>


<hibernate-mapping>
    <class name="com.pojo.B" table="B">
        <id name="bID" type="java.lang.String">
            <column name="BID" length="32" />
            <generator class="assigned" />
        </id>
        ...
        <many-to-one name="a" class="com.A" fetch="select"
        	column="aID" cascade="none" unique="true" />
     </class>
</hibernate-mapping>

但是这样设计的话,如果要对表A解除和表B的关联,同时把表A中的bID设置为-1,必定要通过B对象的实体进行操作,但问题是实体B中的BID由UUID自动生成了,这样会产生类型错误

所以我对B.hbm.xml进行了修改
<hibernate-mapping>
    <class name="com.pojo.B" table="B">
        <id name="bID" type="java.lang.String">
            <column name="BID" length="32" />
            <generator class="assigned" />
        </id>
        ...
        <many-to-one name="a" class="com.A" fetch="select"
        	column="aID" cascade="none" unique="true" update="false" insert="false" />
     </class>
</hibernate-mapping>


update,insert:指定对应的字段是否在用于UPDATE 和/或 INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到的,或者通过trigger(除法器),或者是其他程序(可选 - 默认为 true)

这里加入update="false" insert="false"。打个比方,对表A进行修改和插入,不会对A表中的bID字段进行影响,具体你可以查看HQL语句。
但是这里我们要对A表的bID进行修改,而这样设置的话,bID是无法修改的

===============================
想了N种解决方案,也尝试了N种,都不是很满意,最后的方法可能会让您很吃惊,这也是我说很黄很暴力的原因
PO修改如下
public class A {    
  private String aID;    
  private B b;
  private C c; 
  private String bID; 
  private String cID;  
  ...
  public void setAID(String aID); {   
    this.aID = aID;   
  }     
  public void setB(B b); {   
    this.b = b;   
  }
  public void setC(C c); {   
    this.c = c;   
  }      
  public String getAID(); {   
    return aID;   
  }     
  public B getB(); {    
    return b;   
  }  
  public C getC(); {    
    return c;   
  }

  public void setBID(String bID); {   
    this.bID = bID;   
  }      
  public String getBID(); {   
    return bID;   
  }    
  public void setCID(String cID); {   
    this.cID = cID;   
  }      
  public String getCID(); {   
    return cID;   
  }  
  ...    
}   

B.java省略

配置文件修改如下
<hibernate-mapping>
    <class name="com.pojo.A" table="A">
        <id name="aID" type="java.lang.String">
            <column name="AID" length="32" />
            <generator class="assigned" />
        </id>
        ...
        <property name="bID" type="java.lang.String">
            <column name="bID" length="32" />
        </property>
        <property name="cID" type="java.lang.String">
            <column name="cID" length="32" />
        </property>
        <one-to-one name="b" class="com.pojo.B" 
        	property-ref="a" />
     </class>
</hibernate-mapping>

这样的话,要对A表中的bID进行操作的话,就不用通过B实体对象进行操作了。
而且也符合预先的所有要求,查可以通过可自对象互相关联,各自删改,不会对其他表产生影响
2
1
分享到:
评论
2 楼 卡拉阿风 2009-11-26  
ariestiger 写道
老实说,没怎么看懂,搞这么复杂?你就是添加了几个冗余字段吧?晕

数据库未变。所以没有冗余字段一说。只是PO和配置上稍微改变了下。可以级联操作也可以不级联。
1 楼 ariestiger 2009-11-25  
老实说,没怎么看懂,搞这么复杂?你就是添加了几个冗余字段吧?晕

相关推荐

    hibernate外键实现一对一双向关联关系源码

    在Hibernate中,通常使用`@OneToOne`注解来定义一对一关系,而双向关联则意味着两个实体类都将拥有指向对方的引用。 1. **实体类定义**: 在一对一双向关联中,我们会有两个实体类,例如`User`和`Profile`。`User`...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate主键实现一对一单向关联关系源码

    在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中的唯一一条记录。在Hibernate中,这种关系可以通过共享主键或外键来实现。由于题目中提到的是“主键实现”,我们将重点讨论共享主键的方式。 1. **...

    Hibernate双向一对多

    标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。这种关系...

    Hibernate双向一对多经典实例

    **标题:“Hibernate双向一对多经典实例...通过这个实例,新手可以逐步掌握Hibernate处理双向一对多关系的方法,为今后的Java Web开发打下坚实的基础。在实践中不断探索,理解和掌握这些知识点,将有助于提升开发技能。

    Hibernate ORM - 一对多双向连接表关联关系

    “Hibernate ORM - 一对多双向连接表关联关系”这个标题指出我们要讨论的是Hibernate ORM框架中的一种特定数据库关联模型,即一对多的双向关联。在Hibernate中,ORM(对象关系映射)是一种技术,它允许我们用面向...

    Hibernate教程05_关系映射之一对一双向外键关联

    在Hibernate中,一对一关系可以通过两种方式实现:外键关联和主键关联。本教程重点讨论的是外键关联,这意味着一方的表将包含指向另一方表的外键。双向关联意味着两个实体类都可以直接访问彼此。 接下来,我们将...

    Hibernate一对一唯一外键关联映射(双向关联)

    在数据库设计中,这种关系通常通过主键和外键的方式实现,其中一方的主键作为另一方的外键,确保了两表间的一对一关系。 二、唯一外键关联映射 在Hibernate中,一对一关联可以通过配置XML映射文件或使用注解来实现...

    hibernate一对一关联关系

    以上就是关于Hibernate一对一关联关系的详细解释,通过理解和掌握这些知识点,你可以更有效地在Java项目中设计和实现数据库模型,提高代码的可读性和维护性。希望这份资源能帮助你更好地理解和运用Hibernate框架。

    hibernate一对一的关系

    接下来我们将深入探讨Hibernate中的一对一关系映射。 ### 1. 一对一关系的类型 一对一关系分为两种类型:单向和双向。 - **单向一对一**:只有一个实体知道另一个实体的存在,通常通过在一方的类中定义`@OneToOne...

    Hibernate ORM - 一对多双向关联关系

    这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...

    hibernate one to one一对一关系示例

    总的来说,这个“hibernate one to one一对一关系示例”涵盖了如何在Hibernate中定义和操作一对一关联的基本步骤,包括实体类的注解配置、数据库表结构设计以及相关操作。通过对示例的深入学习,开发者能够更好地...

    hibernate 双向一对一基于主键的关联映射

    在数据库中,一对一关系意味着两个表中的每一行都唯一对应另一表中的一个行。在Hibernate中,一对一关联可以通过`@OneToOne`注解来实现。 ### 3. 双向一对一关联 双向一对一关联意味着两个实体类都可以直接访问对方...

    hibernate多对一单向关联关系实现源码

    在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    Hibernate教程07_关系映射之一对一双向主键关联

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是“一对一双向主键关联”。这种关联类型是数据库设计中的常见模式,它允许两个实体类之间通过共享相同的主键来建立关联。在Java应用中,...

    hibernate一对一之唯一外键关联(双向关联)

    本篇主要探讨的是Hibernate中的一对一(OneToOne)关系映射,特别是唯一外键关联(UniDirectional and Bidirectional Association)的情况。我们将深入理解这种关联方式的配置、实现以及它在实际应用中的价值。 1. ...

    hibernate一对一的两种实现方式

    这种关联方式适用于实体间具有天然的一对一关系,例如用户与用户详细信息的关系。 1.2 实现方式 在Hibernate中,可以通过在映射文件或注解中指定`@OneToOne`和`@PrimaryKeyJoinColumn`来实现。例如,对于User和...

    Hibernate Annotation 共享主键一对一双向关联

    本文将详细讲解“Hibernate Annotation 中的共享主键一对一双向关联”。 首先,我们需要理解什么是共享主键(Shared Primary Key)。在一对一的关联关系中,如果两个实体共享同一个主键,那么这种关联被称为共享...

    hibernate一对多,多对一,一对多双向关联

    例如,@OneToOne 可用于表示一对一关系,@ManyToOne 和 @OneToMany 用于多对一和一对多关系。 4. **外键约束:** 在数据库层面,这些关联通常通过外键实现。Hibernate允许在映射文件或注解中指定外键的生成策略。 ...

Global site tag (gtag.js) - Google Analytics