首页 > 解决方案 > FetchType EAGER 在 Windows/MySQL 5.7 中不起作用

问题描述

在一个使用 Hibernate 的 Java 项目中,我很难让 FetchType EAGER 在我的开发数据库上工作,该数据库在 Windows 10 下运行并使用 MySQL 5.7(我也尝试过 MySQL 8)。

奇怪的事实是,当我使用完全相同的数据库结构和数据(从一台机器转储并导入另一台机器)运行完全相同的代码时,它确实可以在 Centos 7/MySQL 5.6 环境中运行。如果我在我的 Windows 机器上运行代码但连接到 Centos 数据库,它也可以工作。如果我在连接到 Windows 数据库的 Centos 机器上运行代码,它就不起作用。

Hibernate 的版本是 5.4.10。

请在下面找到我使用的代码(属性、变量和表的名称已更改,因此可能存在一些错误输入):

实体:

@Entity
@SQLInsert(sql="INSERT IGNORE INTO table1(t2_id,t3_id,order) VALUES(?,?,?)")
public class Table1 implements Serializable
    {

    //----------------------------------------------------
    /*
        Attributes / fields definitions :
    */
    public  Table2  t2;
    public  Table3  t3;
    public  Integer order;

    //---------------------------------
    // STATIC FACTORIES
    //---------------------------------
    //----------------------------------------------------
    /**
        Get the list of relations between table2 and table3
    */
    static public ArrayList<Table1> find
        (
        Session     inSession,
        Table3      inTable3
        )
        {
        TypedQuery< Table1 > vQuery = inSession.createQuery( "SELECT t1 FROM Table1 t1 WHERE t1.t3 = :int3", Table1.class );
        vQuery.setParameter( "int3", inTable3 );

        return new ArrayList<>( vQuery.getResultList() );
        }
    }

XML:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"hltp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="..." default-access="field">
    <class name = "Table1" table = "table1" dynamic-update="true">

        <meta attribute = "class-description">
         ...
        </meta>

        <composite-id>
            <key-many-to-one name="t2" class="Table2"   column="t2" lazy="false"/>
            <key-many-to-one name="t3" class="Table3"   column="t3" lazy="false"/>
        </composite-id>

        <property name = "order" column = "order" not-null="true"/>

    </class>

</hibernate-mapping>

工厂电话:

ArrayList< Table1 > vRelations = Table1.find( fDbSession, t3 );

在 Centos 数据库上,它就像一个魅力,我得到我的 Table1 元素,其中包含初始化的 Table2 和 Table3 元素。在 Windows 数据库中,我得到的只是一个“HibernateProxy”元素。

标签: javamysqlhibernatejpa

解决方案


推荐阅读