Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在另一个对象中保存对象时出现Hibernate getHibernateTemplate问题_Java_Mysql_Hibernate_Spring_Foreign Keys - Fatal编程技术网

Java 在另一个对象中保存对象时出现Hibernate getHibernateTemplate问题

Java 在另一个对象中保存对象时出现Hibernate getHibernateTemplate问题,java,mysql,hibernate,spring,foreign-keys,Java,Mysql,Hibernate,Spring,Foreign Keys,我最近更改了代码以引用getHibernateTemplate(),现在我的表单似乎无法正确保存,下面是代码: </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" />

我最近更改了代码以引用getHibernateTemplate(),现在我的表单似乎无法正确保存,下面是代码:

</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

公共void存储表单(EcoFormFill表单,int userId)
抛出远程异常
{
用户tmpUser=(用户)getHibernateTemplate().load(User.class,新整数(userId));
表格.setUser(tmpUser);
getHibernateTemplate().saveOrUpdate(表单);
}

</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
它抱怨无法将“user_id”设置为null(my DB中的约束)。。。以前我使用的是这种方法:

</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

公共void存储表单(EcoFormFill表单,int userId)
抛出远程异常
{
会话ses=getHibernateTemplate().getSessionFactory().openSession();
尝试
{
用户tmpUser=(User)ses.load(User.class,新整数(userId));
表格.setUser(tmpUser);
ses.保存或更新(表格);
}
捕获(例外e)
{
log.error(e.getMessage(),e);
抛出新的RemoteException(例如getMessage());
}
最后
{
ses.flush();
ses.close();
}
}

</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
这种方法工作得很好,但它给了我单元测试的麻烦,所以我需要在getHibernateTemplate()中使用前面的方法

</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
以下是我的表单与无法填充的用户id之间的关联:

<id name="id">
  <generator class="native"/>
</id>
...
...
<many-to-one column="user_id" name="user" not-null="false"/>
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

...
...

在这两种情况下生成的SQL语句都是相同的,只是用户id没有正确插入到参数中。

Trevor您的应用程序上下文似乎是这样的
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

org.hibernate.dialogue.mysqldialogue
创造


看看上面,这一部分代表了应用程序上下文中所需的最小值。

Trevor您的应用程序上下文看起来是这样的吗
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

org.hibernate.dialogue.mysqldialogue
创造


综上所述,这一部分代表了应用程序上下文中所需的最低限度。

。您能否说明在这两种情况下执行的是什么SQL。另外,您能否添加一些有关
EcoFormFill
User
之间关联的详细信息(是双向的吗?)。作为补充说明,我不建议使用
HibernateTemplate
,但这是另一个故事(请参阅)。感谢您的回答Pascal,我刚刚更新了我的问题,请参阅上文。好的。那么这是一个“假”多对一?您是否也有从
用户
EcoFormFill
的关联?当使用
get()
而不是
load()
时,您会得到相同的结果吗?我不知道这是一个“假”结果。。。而且我没有从用户到EcoFormFill的关联。我确实尝试了get()和load(),但都没有成功。当我查看您的代码时,它看起来像一对一的关联(您没有将用户添加到集合中,是吗?),这就是为什么我称它为伪多对一。不管怎么说,这并没有回答问题,我也不知道如何重现这个问题。奇怪。您能否说明在这两种情况下执行的是什么SQL。另外,您能否添加一些有关
EcoFormFill
User
之间关联的详细信息(是双向的吗?)。作为补充说明,我不建议使用
HibernateTemplate
,但这是另一个故事(请参阅)。感谢您的回答Pascal,我刚刚更新了我的问题,请参阅上文。好的。那么这是一个“假”多对一?您是否也有从
用户
EcoFormFill
的关联?当使用
get()
而不是
load()
时,您会得到相同的结果吗?我不知道这是一个“假”结果。。。而且我没有从用户到EcoFormFill的关联。我确实尝试了get()和load(),但都没有成功。当我查看您的代码时,它看起来像一对一的关联(您没有将用户添加到集合中,是吗?),这就是为什么我称它为伪多对一。无论如何,这并不能回答这个问题,我也不知道如何重现这个问题。
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="yourRootPackage" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>