3
  • 我有 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 中可用

  • 请对此提供帮助。谢谢。

4

2 回答 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 回答