У меня есть 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"
Когда я бегу от контроллера 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
Пожалуйста, помогите в этом. Спасибо.
ответ
Это позволит вам начать работу, используя 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;
}
Просьба указать код вашего Контроллера getAllChildWithParetOrgs(parentId);
. Это будет более полезно. Кроме того, в соответствии с моим пониманием из объединений запросов hibernate и моментальных снимков базы данных, я не думаю, что вывод JSON должен завершать записи. Вы можете найти объяснение ниже:
В качестве ParentID, который вы прошли это 0. И на основании запроса спящего режима включается и моментальные снимки базы данных, кажется, что нет индивидуального учета для OrgId = 0. И от parentOrgId = 0 части пункта, он имеет в виду ребенка: запись, которая имеет orgId как 1. Впоследствии, он имеет в виду дочерних записей для orgId = 1, то есть записи с parentOrgId = 1 которые являются записями: orgId = 2 & orgId = 3. Я не думаю, что ваш объект JSON должен заручиться новыми результатами после этого