我有User类和BattleReportILogItem类。此类(UserBattleReportILogItem)是@Entity

User具有0..N BattleReportILogItem

用户

    @Entity
    @Table(name = DomainConstant.TABLE_USER)
    public class User implements Serializable {

        @Id
        @Column(name = DomainConstant.DOMAIN_USER_ID)
        @GeneratedValue
        private Long userId;

        @ManyToMany(cascade = {CascadeType.ALL})
        @JoinTable(name = DomainConstant.VIEW_USER_BATTLE_LOGS, joinColumns = {
            @JoinColumn(name = DomainConstant.DOMAIN_USER_ID)}, inverseJoinColumns = {
            @JoinColumn(name = DomainConstant.DOMAIN_BATTLE_REPORT_ID)})
        private Set<BattleReportILogItem> setOfBattleLogs = new HashSet<>();

....(other stuff, get and set methods...)


BattleReportILogItem

@Entity
@Table(name = DomainConstant.TABLE_BATTLE_REPORT)
public class BattleReportILogItem implements Serializable {



      @Id
        @GeneratedValue
        @Column(name = DomainConstant.DOMAIN_BATTLE_REPORT_ID)
        private Long BattleReportILogItemId;

        @ManyToMany(mappedBy = "setOfBattleLogs")
        private Set<User> setOfBattleLogs = new HashSet<>();

        ....(other stuff, get and set methods...)


问题是,我加载User程序会加载private Set<BattleReportILogItem> setOfBattleLogs = new HashSet<>();中的所有数据。这意味着我的集合1 000 000 000中的setOfBattleLogs个项目。我不想将数据加载到此set。对于负载数据,我具有BattleReportLogItemDao DAO。

有什么解决方案如何不将数据加载到我的set吗?

我希望你能理解我... :-))

谢谢您的帮助。

编辑persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <persistence-unit name="com.donutek"  transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>

            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>

            <property name="hibernate.connection.password" value=""/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db"/>

            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <property name="hibernate.validator.apply_to_ddl" value="true" />

            <property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
            <property name="hibernate.c3p0.min_size" value="5"/>
            <property name="hibernate.c3p0.max_size" value="20"/>
            <property name="hibernate.c3p0.timeout" value="300"/>
            <property name="hibernate.c3p0.max_statements" value="50"/>
            <property name="hibernate.c3p0.idle_test_period" value="300"/>

        </properties>
    </persistence-unit>
</persistence>


编辑2:
对于负载用户,我正在使用代码:

@Override
public User findByEmail(String email) {
    TypedQuery<User> q = em.createQuery("SELECT u FROM " + User.class.getSimpleName() + " u WHERE u.email = :uemail", User.class);
    q.setParameter("uemail", email);
    try {
        return q.getSingleResult();
    } catch (NoResultException e) {
        return null;
    }
}

最佳答案

您可以使用参数fetchtype Lazy。现在您的策略似乎急切。

10-06 02:35