| AA |多对多| BB |多对多| CC |再次JoinTable未填入多对多休眠关系
与映射连接表成为
| AA | - | AA_BB | - | BB | - | BB_CC | - | CC |
(我不能发表图片对不起,低信誉)
编辑: 短的问题是 为什么如果创建了Aa元素,BB元素,抄送元素 添加抄送至BB收集,BB至Aa收藏 保存(Aa) 工作正常(已填充AA_BB)?
但是,如果我创建了Bb元素,AA元素,抄送元素 添加了Aa至BB收集 添加抄送至BB收集 保存(BB) (AA_BB 不填?)
BB_CC总是填充。
末编辑
CREATE TABLE BB_CC (
BBIDBB number(10) NOT NULL,
CCIDCC number(10) NOT NULL,
PRIMARY KEY (BBIDBB,
CCIDCC));
CREATE TABLE AA_BB (
AAIDAA number(10) NOT NULL,
BBIDBB number(10) NOT NULL,
PRIMARY KEY (AAIDAA,
BBIDBB));
CREATE TABLE CC (
IDCC number(10) NOT NULL,
DESCR varchar2(10) NOT NULL,
PRIMARY KEY (IDCC));
CREATE TABLE BB (
IDBB number(10) NOT NULL,
DESCR varchar2(10) NOT NULL,
PRIMARY KEY (IDBB));
CREATE TABLE AA (
IDAA number(10) NOT NULL,
DESCR varchar2(10) NOT NULL,
PRIMARY KEY (IDAA));
ALTER TABLE BB_CC ADD CONSTRAINT FKBB_CC976918 FOREIGN KEY (BBIDBB) REFERENCES BB (IDBB);
ALTER TABLE BB_CC ADD CONSTRAINT FKBB_CC529716 FOREIGN KEY (CCIDCC) REFERENCES CC (IDCC);
ALTER TABLE AA_BB ADD CONSTRAINT FKAA_BB470776 FOREIGN KEY (AAIDAA) REFERENCES AA (IDAA);
ALTER TABLE AA_BB ADD CONSTRAINT FKAA_BB23574 FOREIGN KEY (BBIDBB) REFERENCES BB (IDBB);
Hibernate配置文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- ORACLE -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@10.10.1.8:1521:GEROS</property>
<property name="connection.username">xxxx</property>
<property name="connection.password">xxxx</property>
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup-->
<property name="hbm2ddl.auto">create</property>
<!-- Names the annotated entity class -->
<mapping class="it.erreeffe.erreeffe2.Aa"/>
<mapping class="it.erreeffe.erreeffe2.Bb"/>
<mapping class="it.erreeffe.erreeffe2.Cc"/>
</session-factory>
</hibernate-configuration>
而且从表 机管局(BB,CC类似)的某些部分缺失的逆转JPA类。
@Entity
public class Aa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="AA_IDAA_GENERATOR", sequenceName="SEQ_AA")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="AA_IDAA_GENERATOR")
private long idaa;
private String descr;
//bi-directional many-to-many association to Bb
@ManyToMany(cascade={CascadeType.ALL})
@JoinTable(
name="AA_BB"
, joinColumns={
@JoinColumn(name="AAIDAA")
}
, inverseJoinColumns={
@JoinColumn(name="BBIDBB")
}
)
private Set<Bb> bbs;
我的测试,第一次工作,第二次没有。
第一:
Session session;
SessionFactory sf_ORA = new Configuration().configure(
"hibernate.cfg.ora.xml").buildSessionFactory();
session = sf_ORA.openSession();
//A
Aa a = new Aa();
a.setDescr("A1");
a.setBbs(new HashSet<Bb>());
//B
Bb b1 = new Bb();
b1.setCcs(new HashSet<Cc>());
Bb b2 =new Bb();
b2.setCcs(new HashSet<Cc>());
b1.setDescr("B1");
b2.setDescr("B2");
//C
Cc c1 = new Cc();
Cc c2 = new Cc();
Cc c3 = new Cc();
c1.setDescr("C1");
c2.setDescr("C2");
c3.setDescr("C3");
//FILL B
b1.getCcs().add(c1);
b1.getCcs().add(c2);
b2.getCcs().add(c2);
b2.getCcs().add(c3);
//FILL A
a.getBbs().add(b1);
a.getBbs().add(b2);
session.beginTransaction();
try
{
session.save(a);
session.flush();
session.getTransaction().commit();
}
catch(HibernateException ex)
{
session.getTransaction().rollback();
throw ex;
}
这做正确的工作: 休眠创造了我所有需要的语句:
Hibernate: insert into Aa (descr, idaa) values (?, ?)
Hibernate: insert into Bb (descr, idbb) values (?, ?)
Hibernate: insert into Cc (descr, idcc) values (?, ?)
Hibernate: insert into Cc (descr, idcc) values (?, ?)
Hibernate: insert into Bb (descr, idbb) values (?, ?)
Hibernate: insert into Cc (descr, idcc) values (?, ?)
Hibernate: insert into AA_BB (AAIDAA, BBIDBB) values (?, ?)
Hibernate: insert into AA_BB (AAIDAA, BBIDBB) values (?, ?)
Hibernate: insert into BB_CC (BBIDBB, CCIDCC) values (?, ?)
Hibernate: insert into BB_CC (BBIDBB, CCIDCC) values (?, ?)
Hibernate: insert into BB_CC (BBIDBB, CCIDCC) values (?, ?)
Hibernate: insert into BB_CC (BBIDBB, CCIDCC) values (?, ?)
连接结果查询是正确的:
A1 | B1 | C1
A1 | B1 | C2
A1 | B2 | C2
A1 | B2 | C3
二(TA-丹这是问题)从DB 读B1添加新的AA(A2),以B1.Aas集合添加新的抄送(c4)到B1.Ccs收集,更新B1。
Bb b1=null;
session.beginTransaction();
try
{
Query qGetB1=session.createQuery("Select id from Bb where DESCR ='B1'");
long idB1=(Long) qGetB1.list().get(0);
b1=(Bb) session.load(Bb.class, idB1);
session.flush();
session.getTransaction().commit();
}
catch(HibernateException ex)
{
session.getTransaction().rollback();
throw ex;
}
Aa a2 = new Aa();
a2.setDescr("A2");
Cc c4 = new Cc();
c4.setDescr("C4");
b1.getAas().add(a2);
b1.getCcs().add(c4);
session.beginTransaction();
try
{
session.flush();
session.saveOrUpdate(b1);
session.flush();
session.getTransaction().commit();
}
catch(HibernateException ex)
{
session.getTransaction().rollback();
throw ex;
}
生成Hibernate的:
Hibernate: select bb0_.idbb as col_0_0_ from Bb bb0_ where DESCR='B1' //SEARCH B1 ID
Hibernate: select bb0_.idbb as idbb1_0_, bb0_.descr as descr1_0_ from Bb bb0_ where bb0_.idbb=? //GET B1
Hibernate: select aas0_.BBIDBB as BBIDBB1_1_, aas0_.AAIDAA as AAIDAA1_, aa1_.idaa as idaa0_0_, aa1_.descr as descr0_0_ from AA_BB aas0_, Aa aa1_ where aas0_.AAIDAA=aa1_.idaa and aas0_.BBIDBB=? GET B1.Aas
Hibernate: select ccs0_.BBIDBB as BBIDBB1_1_, ccs0_.CCIDCC as CCIDCC1_, cc1_.idcc as idcc2_0_, cc1_.descr as descr2_0_ from BB_CC ccs0_, Cc cc1_ where ccs0_.CCIDCC=cc1_.idcc and ccs0_.BBIDBB=? GET B1.Ccs
Hibernate: insert into Aa (descr, idaa) values (?, ?) //OK
Hibernate: insert into Cc (descr, idcc) values (?, ?) //OK
Hibernate: insert into BB_CC (BBIDBB, CCIDCC) values (?, ?) //OK
... What about AA_BB record???? //!!!!!!!!
为什么joinTable AA_BB未填充?
谢谢大家的关注。 Regards, Francesco。
这就是答案。非常感谢。 – 2012-03-09 14:56:08
有没有人知道文档中说明了哪里? – ds011591 2015-08-07 20:35:27
JPA规范第3.2.4节:“管理实体之间的双向关系将基于关系持有方所持有的引用持久化,开发者有责任将内存中引用保留在拥有者一方,而那些在相反的一面保持一致,当它们发生变化时... [...]确保对关系的反面进行更改导致适当的更新,这一点尤其重要,以确保更改不会发生当它们同步到数据库时会丢失。“ – 2015-08-07 20:50:41