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 /> </id> ... <one-to-one name="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 /> </id> ... <many-to-one name="a" fetch="select" column="aID" cascade="none" unique="true" /> </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 /> </id> ... <many-to-one name="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)
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; } ... }
<hibernate-mapping> <class name="com.pojo.A" table="A"> <id name="aID" type="java.lang.String"> <column name="AID" length="32" /> <generator /> </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" property-ref="a" /> </class></hibernate-mapping>