一对多的双向关系在内存HSQLDB中无效

时间:2013-11-21 04:58:52

标签: java mysql hibernate hibernate-mapping hsqldb

我在城市和人之间有一对多的映射。一个城市可以有很多人。 在持久化数据之后,从hibernate获取People对象时,我也获得了city对象.City是父表/实体。 但是在使用hibernate获取城市对象时,people对象(set或list)是空的。尝试对抗MYSQL数据库时,相同的代码工作正常。但是在内存数据库中使用HSQL时,我正面临着这个问题。 PFB详情: -

城市实体: -

@Entity
@Table(name="CITY")
public class City {
    @Id
    @GeneratedValue
    @Column(name="CITY_ID")
    private long id;
    @Column(name="CITY_NAME", nullable=false, unique= true)
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "city" )
    private Set<People> people = new HashSet<People>(0);

人民实体: -

@Entity
@Table(name="People")
public class People {
    @Id
    @GeneratedValue
    @Column(name="People_ID")
    private long id;
    @Column(name="People_NAME", nullable=false, unique= true)
    private String name;
    @ManyToOne
    @JoinColumn(name = "CITY_ID")
    City city;

我将首先将值插入City表。示例值:-(“London”)..并且在持久化后如果生成的cityid为“1001” 然后将值插入人员表。示例值:-(“John”,1001) 然后在使用hibernate获取City对象的值时,people(set)为空。 但是,如果我获取People对象的值,则city对象具有值。 PFb my xml文件: -

<bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
            <property name="url" value="jdbc:hsqldb:TEST" />
            <property name="username" value="sa" />
            <property name="password" value="" />
        </bean>
        <bean id="sessionFactory"                class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="packagesToScan" value="entity" />
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                    <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
                    <prop key="hibernate.show_sql">true</prop>
                </props>
            </property>
        </bean>

        <bean id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>
        <tx:annotation-driven transaction-manager="transactionManager" />        
    </beans>

是内存数据库的限制,还是我遗漏了什么。 任何建议或链接都​​会有所帮助

2 个答案:

答案 0 :(得分:0)

我最近创建了一个示例应用程序来演示使用hibernate的这种关系,以下是代码。

@Entity
@Table(name = "COMPANY")
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "COMP_NAME", length = 1000)
    private String companyName;
    @Column(name = "COMP_ADDRESS", length = 1000)
    private String companyAddress;
    @OneToOne(mappedBy = "company")
    private Employee emp;

    @OneToMany
    private Set<Department> departments = new HashSet<Department>();

    public Set<Department> getDepartments() {
        return departments;
    }

    public void setDepartments(Set<Department> departments) {
        this.departments = departments;
    }

以下是我的Department.java

@Entity
@Table(name = "DEPARTMENT")
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String deptName;
    @ManyToOne
    private Company company;

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

看到我没有使用@JoinColumn,这导致创建了一个关系表,只需从您的People类中删除@JoinColumn,您就可以从City类中获取人员集合。

答案 1 :(得分:0)

在选择之前检查是否应为所有插入提交事务,并确保在获取之前在当前上下文中刷新/清除实体,有时候hibernate可能会返回与当前没有分离的相同实体持久化上下文,希望这有帮助!!