我有 2 个表
1.Org[ORG_ID,PARENT_ID,LANG_ID(REFERENCES LANG)] 2.Lang[LANG_ID,LANG_NAME]我的 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; } }
组织.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>
我的休眠查询是:“从 Org 作为 org WHERE org.parentOrgId = :parentOrgId 或 org.orgId=:parentOrgId”
当我从控制器列表 listOrganization = organizationService.getAllChildWithParetOrgs(parentId);//parentId = 0运行时
我得到了结果 ObjectList/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 ]
- 这里Currency也与Lang表相同,它的 Currency_Id 引用 Currency
我无法在 Array 中获取 2nd & 3rd Org 数据,它在 Lang.Orgs 和 Lang.Orgs.Currency 中可用
请对此提供帮助。谢谢。
问问题
1708 次
2 回答
0
请提供您的 Controller 方法的代码getAllChildWithParetOrgs(parentId);
。那会更有帮助。此外,根据我对休眠查询连接和数据库快照的理解,我认为 JSON 输出不应再包含记录。请在下面找到解释:
由于您传递的 parentId 为 0。根据休眠查询连接和数据库快照,似乎没有OrgId = 0的单独记录。而从子句的parentOrgId = 0部分开始,它指的是孩子:orgId 为 1 的记录。随后,它指的是 orgId = 1 的子记录,即 parentOrgId = 1的记录记录:orgId = 2 & orgId = 3。我不认为你的 JSON 对象应该在那之后获得更多结果
于 2016-08-22T10:09:31.290 回答
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>
朗实体看起来像这样:
@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;
组织实体如下所示:
@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;
}
于 2016-08-16T10:38:46.457 回答