The problem of matching sleep mode with an unrelated collection

Welcome,

I have a problem displaying Hibernate.

Database structure:

TableA
 -ID_A --PK

TableB
 -ID_B --PK
 -ID_A -- FK -> TableA

TableC
 -ID_C -- PK
 -ID_A -- FK -> TableA

POJO structure:

class TableA extends Pojo {

 /*Some Fields*/

}

class TableB extends Pojo {

  TableA tableA; 

 /*Some properties*/

}

class TableC extends Pojo {

 TableA tableA;

 Collection<tableB> tableBs;

}

I want to have a collection of TableB elements in the mapping for TableC Pojo, the display key is tableA.

This collection should be read only.

The mapping should be hbm not annotations.

I probably did it for all possible ways ... the closure that I get is the case when I work on one TableC object, then everything is correct, but if I load their collection, only the last one has the correct collection set.

UPDATE: case description.

Usage Example 1: Loading a Single TableC Object

Session session = (Session) getHibernateTemplate().getSessionFactory().openSession();
SQLQuery sqlQuery = session.createSQLQuery("SELECT c.* FROM TableC c WHERE c.ID_C = 1"); //Oracle
  sqlQuery.addEntity("c", TableC.class);
return sqlQuery.list(); //Return list with sigle object of TableC

, . TableB. , .

2

Session session = (Session) getHibernateTemplate().getSessionFactory().openSession();
SQLQuery sqlQuery = session.createSQLQuery("SELECT c.* FROM TableC c WHERE c.ID_C in (1,2)"); //Oracle
  sqlQuery.addEntity("c", TableC.class);
return sqlQuery.list(); // throws "collection is not associated with any session" 

Hibernate .

* , .

+3
4

Hibernate # HHH-2862

, , .

Hibernate , 'persistenceContext.addUninitializedCollection()', , , . ​​ , StatefulPersistenceContext.initializeNonLazyCollections() , forceInitialization(), , " -" " . , , , .

, ?

+9

, , -ref Attribute

,

, To false

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping 
          PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--Set up your package right here-->
<hibernate-mapping package="br.com.ar">
     <class name="Aa" table="A">
         <id name="id">
             <generator class="native"/>
         </id>
    </class>
    <class name="Bb" table="B">
         <id name="id">
             <generator class="native"/>
         </id>
         <many-to-one name="aa" column="A_ID" class="Aa"/>
    </class>
    <class name="Cc" table="C">
         <id name="id">
             <generator class="native"/>
         </id>
         <many-to-one name="aa" column="A_ID" class="Aa"/>
         <bag name="bbList" table="B" mutable="false">
             <key column="A_ID" property-ref="aa"/>
             <one-to-many class="Bb"/>
         </bag>
    </class>
</hibernate-mapping>

br.com.ar.Aa

public class Aa {

    private Integer id;

    // getter and setter's

}

br.com.ar.Bb

public class Bb {

    private Integer id;

    private Aa aa;

    // getter and setter's

}

br.com.ar.Cc

public class Cc {

    private Integer id;

    private Aa aa;

    private Collection<Bb> bbList = new ArrayList<Bb>();

    // getter and setter's

}

,

query = new StringBuilder().append("SELECT ")
                               .append("{cc.*} ")
                           .append("from ")
                               .append("C cc ")
                           .append("where ")
                               .append("cc.id = 1 ")
                           .toString();

, Bb. ,

, NATIVE SQL Cc. . , , BbList. , - , (Notice fetch = "select" lazy = "false" )

<class name="Cc" table="C">
     ...
     <bag name="bbList" table="B" mutable="false" fetch="select" lazy="false">
         <key column="A_ID" property-ref="aa"/>
         <one-to-many class="Bb"/>
     </bag>
</class>

fetch = "select" select. " " " " (bbList, ???) fetch , , . lazy = "true", , lazy = "false", Hibernate SQL SELECT.

query = new StringBuilder().append("SELECT ")
                               .append("{cc.*} ")
                           .append("from ")
                               .append("C cc ")
                           .append("where ")
                               .append("cc.id in (1,2) ")
                           .toString();

org.hibernate.HibernateException: -

???

Cc bbList A_ID, property-ref, right???

<class name="Cc" table="C">
     ...
     <bag name="bbList" table="B" mutable="false" fetch="select" lazy="false">
         <key column="A_ID" property-ref="aa"/>
         <one-to-many class="Bb"/>
     </bag>
</class>

, A_ID , . aa , . ,

List<Cc> resultList = new ArrayList<Cc>();
for (Integer id : new Integer[] {1, 2}) {
    query = new StringBuilder().append("SELECT ")
                                   .append("{cc.*} ")
                               .append("from ")
                                   .append("C cc ")
                               .append("where ")
                                   .append("cc.id = :id ")
                               .toString();

    resultList.addAll(
             session.createSQLQuery(query)
                    .addEntity("cc", Cc.class)
                    .setParameter("id", id)
                    .list());
}

JDBC-

+5

, , , , , TableC TableB, TableC FK A.

0

, ORM, . , . . , ORM.

B C A. , :

class A
{
 IList<B> Bs { get; private set; }
 IList<C> Cs { get; private set; }
}

class B
{
  A A { get; set; }
}

class C
{
  A A { get; set; }
}

:

<class name="A">
  <bag name="As" class="A">
    <key column="ID_A"/>
  </bag>
  <bag name="Bs" class="B">
    <key column="ID_A"/>
  </bag>
</class>

<class name="B">
  <many-to-one name="A" class="A" column="ID_A"/>
</class>

<class name="C">
  <many-to-one name="A" class="A" column="ID_A"/>
</class>

:

B b = session.Get<B>(id);
foreach(C c in b.A.Cs)
{
  // iterate C's
}

HQL:

SQLQuery sqlQuery = session.createQuery("FROM TableC c WHERE c.ID_C in (1,2)"); 
  • , SQL .
  • addEntity - ( ). , .

Edit:

, B, A, C:

    C c = session.Get<C>(cId);

    SQLQuery sqlQuery = session.createQuery(
@"select B
from B, C
where B.A = C.A
  and C = :c")
      .addEntity("c", c);

:

    C c = session.Get<C>(cId);

    SQLQuery sqlQuery = session.createQuery(
@"select B
from B
where B.A = :a")
      .addEntity("a", c.A);
0

Source: https://habr.com/ru/post/1758981/


All Articles