2
  • У меня есть 2 таблицы
    1.Org [org_ID, PARENT_ID, LANG_ID (Лит LANG)] 2.Lang [LANG_ID, LANG_NAME]Спящий @ManyToOne и @OneToMany выборки данных в виде списка (число записей)

  • Мои JAVA Entity файлы

    Lang.java

    @Entity 
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "langId") 
    @JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" }) 
    @SuppressWarnings("serial") 
    public class Lang implements java.io.Serializable { 
        private BigDecimal langId; 
        private String langName; 
        private Set<Org> orgs = new HashSet<Org>(0); 
        public Lang() { 
        } 
        public Lang(BigDecimal langId, Set<Org> orgs) { 
         this.langId = langId; 
         this.orgs = orgs; 
        } 
        public BigDecimal getLangId() { 
         return this.langId; 
        } 
        public void setLangId(BigDecimal langId) { 
         this.langId = langId; 
        } 
        public String getLangName() { 
         return this.langName; 
        } 
        public void setLangName(String langName) { 
         this.langName = langName; 
        }public void setOrgs(Set<Org> orgs) { 
         this.orgs = orgs; 
        } 
    } 
    

    Org.java

    @Entity 
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "orgId") 
    @JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" }) 
    @SuppressWarnings("serial") 
    public class Org implements java.io.Serializable { 
        @Id 
        @Column(name = "orgId") 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        private BigDecimal orgId; 
        private BigDecimal parentOrgId; 
        @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "langId",scope=Lang.class) 
        public Org() { 
        } 
        public Org(BigDecimal orgId, BigDecimal parentOrgId, Lang lang) { 
         this.orgId = orgId; 
         this.parentOrgId = parentOrgId; 
         this.lang = lang; 
        } 
        public BigDecimal getOrgId() { 
         return this.orgId; 
        } 
        public void setOrgId(BigDecimal orgId) { 
         this.orgId = orgId; 
        } 
        public BigDecimal getParentOrgId() { 
         return this.parentOrgId; 
        } 
        public void setParentOrgId(BigDecimal parentOrgId) { 
         this.parentOrgId = parentOrgId; 
        } 
        @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
        public Lang getLang() { 
         return this.lang; 
        } 
        public void setLang(Lang lang) { 
         this.lang = lang; 
        } 
    } 
    
  • Мой HBM Xml файлы

    Org.hbm.xml

    <hibernate-mapping package="com.test.entity"> 
        <class name="com.test.entity.Org" table="ORG"> 
        <id name="orgId" type="big_decimal"> 
         <column name="ORG_ID" precision="22" scale="0" /> 
         <generator class="increment" /> 
        </id>   
        <property name="parentOrgId" type="big_decimal"> 
         <column name="PARENT_ORG_ID" precision="22" scale="0" not-null="true" /> 
        </property> 
        <many-to-one name="lang" class="com.test.entity.Lang" fetch="select"> 
         <column name="LANG_ID" precision="22" scale="0" not-null="true" /> 
        </many-to-one>   
        </class> 
    </hibernate-mapping> 
    

    Lang.hbm.xml

    <hibernate-mapping package="com.test.entity"> 
        <class name="com.test.entity.Lang" table="LANG"> 
        <id name="langId" type="big_decimal"> 
         <column name="LANG_ID" precision="22" scale="0" /> 
         <generator class="increment" /> 
        </id> 
        <property name="langName" type="string"> 
         <column name="LANG_NAME" length="32" not-null="true" unique="true" /> 
        </property> 
        <set name="orgs" table="ORG" inverse="true" lazy="true" fetch="select"> 
         <key> 
         <column name="LANG_ID" precision="22" scale="0" not-null="true" /> 
         </key> 
         <one-to-many class="com.test.entity.Org" /> 
        </set> 
        </class> 
    </hibernate-mapping> 
    
  • Мой Hibernate Query является: "ОТ Org в орг WHERE org.parentOrgId =: parentOrgId или org.orgId =: parentOrgId"

  • Изображение DataBase DATABASE

  • Когда я бегу от контроллера List listOrganization = organizationService.getAllChildWithParetOrgs (ParentID); // ParentID = 0

  • Я получил результат Object Список/JSON Результат

    [ 
        { 
        "orgId": 1, 
        "parentOrgId": 0,  
        "lang": { 
         "langId": 1, 
         "langName": "EN", 
         "orgs": [ 
        { 
         "orgId": 2, 
         "parentOrgId": 1, 
         "lang": 1, 
         "currency": { 
         "currencyId": 1, 
         "currencyCode": "INR", 
         "currencyName": "INR", 
         "currencyDescription": "INDIAN RUPEE", 
         "orgs": [ 
          2, 
          1, 
          { 
         "orgId": 3, 
         "parentOrgId": 1, 
         "lang": 1, 
         "currency": 1,     
          } 
         ] 
         } 
        }, 
        1, 
        3 
         ] 
        }, 
        "currency": 1 
        }, 
        2, //---> Here No 2nd Organization Data 
        3 //---> Here No 3rd Organization Data 
    ] 
    
  • Здесь Валюта также же, как Lang таблица Ее Currency_Id ссылка Валюта
  • я не в состоянии получить второе & 3-данные Org в массиве, он доступен в Lang.Orgs и Lang.Orgs.Currency

  • Пожалуйста, помогите в этом. Спасибо.

ответ

0

Это позволит вам начать работу, используя Spring JPA2 с Hibernate и Jackson.

Я позволю Hibernate создать мои таблицы из объектов.

контекст Spring приложения выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
    http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> 

    <context:component-scan base-package="com.greg" /> 
    <tx:annotation-driven /> 
    <jpa:repositories base-package="com.greg.repository" /> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.h2.Driver" /> 
     <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" /> 
     <property name="username" value="sa" /> 
     <property name="password" value="" /> 
    </bean> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.greg.entity" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.show_sql">false</prop> 
       <prop key="hibernate.format_sql">false</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

</beans> 

Lang объект выглядит следующим образом:

@Entity 
public class Lang { 

    @Id 
    @Column(name = "lang_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long langId; 

    @Column(name = "lang_name") 
    private String langName; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "lang_id", referencedColumnName = "lang_id") 
    private Set<Org> orgs; 

Org объект выглядит следующим образом:

@Entity 
public class Org { 

    @Id 
    @Column(name = "org_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long orgId; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "lang_id", referencedColumnName = "lang_id", updatable = false, insertable = false, nullable = false) 
    private Lang lang; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "parent_id", referencedColumnName = "org_id", updatable = false, insertable = false, nullable = false) 
    private Org parent; 

Это создание таблиц в вопрос.

Spring JPA хранилищами просты:

@Repository 
@Transactional 
public interface OrgRepository extends CrudRepository<Org, Long> { 
} 

и

@Repository 
@Transactional 
public interface OrgRepository extends CrudRepository<Lang, Long> { 
} 

Если я позволяю Джексон сериализации я получаю:

{ 
    "orgId": 4, 
    "lang": { 
     "langId": 1, 
     "langName": "EN", 
     "orgs": null 
    }, 
    "parent": { 
     "orgId": 3, 
     "lang": { 
      "langId": 1, 
      "langName": "EN", 
      "orgs": null 
     }, 
     "parent": { 
      "orgId": 2, 
      "lang": { 
       "langId": 1, 
       "langName": "EN", 
       "orgs": null 
      }, 
      "parent": null 
     } 
    } 
} 

Мой тест:

@Test 
@Transactional 
public void test1() { 

    try { 
     Lang lang = makeLang("EN"); 
     langRepository.save(lang); 
     assertNotNull(lang.getLangId()); 

     Org org1 = new Org(); 
     org1.setLang(lang); 
     orgRepository.save(org1); 

     Org org2 = new Org(); 
     org2.setLang(lang); 
     org2.setParent(org1); 
     orgRepository.save(org2); 

     Org org3 = new Org(); 
     org3.setLang(lang); 
     org3.setParent(org2); 
     orgRepository.save(org3); 

     assertEquals("EN", orgRepository.findOne(org1.getOrgId()).getLang().getLangName()); 
     assertNull(orgRepository.findOne(org1.getOrgId()).getParent()); 

     assertEquals("EN", orgRepository.findOne(org2.getOrgId()).getLang().getLangName()); 
     assertEquals(org1.getOrgId().longValue(), orgRepository.findOne(org2.getOrgId()).getParent().getOrgId().longValue()); 

     assertEquals("EN", orgRepository.findOne(org3.getOrgId()).getLang().getLangName()); 
     assertEquals(org2.getOrgId().longValue(), orgRepository.findOne(org3.getOrgId()).getParent().getOrgId().longValue()); 

     System.out.println(new ObjectMapper().writeValueAsString(org3)); 

     showTables("ORG"); 
     showTables("LANG"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     fail(); 
    } 
} 

private Lang makeLang(String name) { 
    Lang lang = new Lang(); 
    lang.setLangName(name); 
    return lang; 
} 
0

Просьба указать код вашего Контроллера getAllChildWithParetOrgs(parentId);. Это будет более полезно. Кроме того, в соответствии с моим пониманием из объединений запросов hibernate и моментальных снимков базы данных, я не думаю, что вывод JSON должен завершать записи. Вы можете найти объяснение ниже:

В качестве ParentID, который вы прошли это 0. И на основании запроса спящего режима включается и моментальные снимки базы данных, кажется, что нет индивидуального учета для OrgId = 0. И от parentOrgId = 0 части пункта, он имеет в виду ребенка: запись, которая имеет orgId как 1. Впоследствии, он имеет в виду дочерних записей для orgId = 1, то есть записи с parentOrgId = 1 которые являются записями: orgId = 2 & orgId = 3. Я не думаю, что ваш объект JSON должен заручиться новыми результатами после этого