I have 2 tables
1.Org[ORG_ID,PARENT_ID,LANG_ID(REFERENCES LANG)] 2.Lang[LANG_ID,LANG_NAME]My JAVA Entity Files
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; } }
My HBM Xml Files
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>
My Hibernate Query is : "FROM Org as org WHERE org.parentOrgId = :parentOrgId or org.orgId=:parentOrgId"
When I run from controller List listOrganization = organizationService.getAllChildWithParetOrgs(parentId);//parentId = 0
I got result ObjectList/JSON Result is
[ { "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 ]
- Here Currency also same as Lang table Its Currency_Id reference to Currency
am not able to get 2nd & 3rd Org data in Array,it is Available in Lang.Orgs and Lang.Orgs.Currency
Please help on this.Thanks.

- 1,741
- 2
- 18
- 24

- 342
- 5
- 25
2 Answers
This will get you started, I am using Spring JPA2 with Hibernate, and Jackson.
I let Hibernate create my tables from entities.
Spring application context looks like this:
<?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 looks like this :
@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 looks like this :
@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;
This create the tables in your question.
Spring JPA repositories are simple :
@Repository
@Transactional
public interface OrgRepository extends CrudRepository<Org, Long> {
}
and
@Repository
@Transactional
public interface OrgRepository extends CrudRepository<Lang, Long> {
}
If I let Jackson serialize I get :
{
"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
}
}
}
My test is :
@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;
}

- 7,565
- 2
- 21
- 24
Please provide the code of your Controller method getAllChildWithParetOrgs(parentId);
. That will be more helpful. Also, as per my understanding from the hibernate query joins and database snapshots, I don't think JSON output should enlist anymore records. Please find the explanation below:
As the parentId which you've passed is 0. And based on the hibernate query joins and the database snapshots, it seems that there is no individual record for OrgId = 0. And from parentOrgId = 0 part of the clause, it is referring to the child: the record which has orgId as 1. Subsequently, it is referring to the child records for orgId = 1, that is, the records with parentOrgId = 1 which are the records: orgId = 2 & orgId = 3. I dont think your JSON object should enlist any more results after that

- 682
- 1
- 5
- 13