0

(まず第一に..私の英語でごめんなさい..)

だから私は春のrooプロジェクトに取り組んでいます..私は30のテーブルのようなmysqlデータベースからリバースエンジニアリングを行っています。問題は、デバッグログで確認できるように、遅延読み込みが機能していない ため、 「java.lang.OutOfMemoryError:Javaヒープスペース」エラーがスローされることです。

テーブルに多くの行がありません。つまり、15行を超えるテーブルはありません。

私はすでに追加しようとしました

@OneToMany(mappedBy = "unidadId", fetch = FetchType.LAZY)
private Set<Area> areas;
@Fetch(FetchMode.SELECT)

public Set<com.springroo.gqr.dominio.Area> getAreas() {
    return areas;
}

@ManyToOne (fetch = FetchType.LAZY) //which does exactly the oposite: EAGER :S and it makes it even slooooooower..
@JoinColumn(name = "unidad_id", referencedColumnName = "id", nullable = false)
private Unidad unidadId;

だから私はそれをに変更しました

@ManyToOne (optional=false)
@JoinColumn(name = "unidad_id", referencedColumnName = "id", nullable = false)
private Unidad unidadId;

私も試しました

@LazyCollection(LazyCollectionOption.EXTRA)

@LazyCollection(LazyCollectionOption.TRUE)

trueをデフォルトに設定して永続ファイルを変更しようとしました-lazy-..しかし..何もありません:(

私が何をしているように見えますが、Hibernateは遅延読み込みに変更されないので、遅延読み込みをどこに設定する必要があるのか​​、または何が欠けているのか疑問に思っています。

誰かが私を助けることができますか..?

これは私のルースクリプトです

project --topLevelPackage com.springroo.GQR
jpa setup --provider HIBERNATE --database MYSQL --databaseName bd_gqr --userName root --password ******
database reverse engineer --schema bd_gqr --package ~.dominio
web mvc setup
web flow 
web mvc all --package ~.web
web mvc language --code es
security setup
perform tests
perform eclipse

これらは私のクラスです:public class Area {

@ManyToOne(optional = false)
@JoinColumn(name = "unidad_id", referencedColumnName = "id", nullable = false)
private Unidad unidadId;

@OneToMany(mappedBy = "areaId", fetch = FetchType.LAZY)
@Fetch(FetchMode.SELECT)
private Set<Empleado> empleadoes;

@OneToMany(mappedBy = "areaId", fetch = FetchType.LAZY)
@Fetch(FetchMode.SELECT)
private Set<Queja> quejas;


@Column(name = "nombre", length = 45, unique = true)
@NotNull
private String nombre;

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}
public Unidad AgetUnidadId() {
    return unidadId;
}

public void setUnidadId(Unidad unidadId) {
    this.unidadId = unidadId;
}

public Set<com.springroo.gqr.dominio.Empleado> getEmpleadoes() {
    return empleadoes;
}

public void setEmpleadoes(Set<com.springroo.gqr.dominio.Empleado> empleadoes) {
    this.empleadoes = empleadoes;
}

public Set<com.springroo.gqr.dominio.Queja> getQuejas() {
    return quejas;
}

public void setQuejas(Set<com.springroo.gqr.dominio.Queja> quejas) {
    this.quejas = quejas;
}

}

public class Unidad {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;

public Integer getId() {
    return this.id;
}

public void setId(Integer id) {
    this.id = id;
}

@OneToMany(mappedBy = "unidadId", fetch = FetchType.LAZY)
private Set<Area> areas;

@Fetch(FetchMode.SELECT)
public Set<com.springroo.gqr.dominio.Area> getAreas() {
    return areas;
}

public void setAreas(Set<com.springroo.gqr.dominio.Area> areas) {
    this.areas = areas;
}
}

これらは私のテーブル定義です:

 <table name="area">
    <column name="id" primaryKey="true" required="true" scale="0" size="10" type="4,INT"/>
    <column name="unidad_id" primaryKey="false" required="true" scale="0" size="10" type="4,INT"/>
    <column name="nombre" primaryKey="false" required="true" scale="0" size="45" type="12,VARCHAR"/>
    <foreign-key foreignTable="unidad" name="fk_area_unidad1" onDelete="cascade" onUpdate="cascade">
        <option key="exported" value="false"/>
        <reference foreign="id" local="unidad_id"/>
    </foreign-key>
    <foreign-key foreignTable="empleado" name="fk_empleado_area1" onDelete="cascade" onUpdate="cascade">
        <option key="exported" value="true"/>
        <reference foreign="area_id" local="id"/>
    </foreign-key>
    <foreign-key foreignTable="queja" name="fk_quejas_areas1" onDelete="cascade" onUpdate="cascade">
        <option key="exported" value="true"/>
        <reference foreign="area_id" local="id"/>
    </foreign-key>
    <unique name="PRIMARY">
        <unique-column name="id"/>
    </unique>
    <unique name="nombre_UNIQUE">
        <unique-column name="nombre"/>
    </unique>
    <index name="fk_area_unidad1">
        <index-column name="unidad_id"/>
    </index>
</table>


    <table name="unidad">
    <column name="id" primaryKey="true" required="true" scale="0" size="10" type="4,INT"/>
    <column name="clues" primaryKey="false" required="true" scale="0" size="25" type="12,VARCHAR"/>
    <column name="nombre" primaryKey="false" required="true" scale="0" size="100" type="12,VARCHAR"/>
    <foreign-key foreignTable="area" name="fk_area_unidad1" onDelete="cascade" onUpdate="cascade">
        <option key="exported" value="true"/>
        <reference foreign="unidad_id" local="id"/>
    </foreign-key>
    <unique name="PRIMARY">
        <unique-column name="id"/>
    </unique>
    <unique name="nombre_UNIQUE">
        <unique-column name="nombre"/>
    </unique>
    <unique name="clues_UNIQUE">
        <unique-column name="clues"/>
    </unique>
</table>

デバッグログの一部:

Hibernate: select quejas0_.area_id as area3_4_2_, quejas0_.id as id2_, quejas0_.id as id18_1_, quejas0_.area_id as area3_18_1_, quejas0_.folio as folio18_1_, quejas0_.medio_id as medio4_18_1_, quejas0_.tramite_id as tramite5_18_1_, medioqueja1_.id as id13_0_, medioqueja1_.medio as medio13_0_ from queja quejas0_ inner join medio_queja medioqueja1_ on quejas0_.medio_id=medioqueja1_.id where quejas0_.area_id=?

つまり、不要なテーブルをロードしないようにroo/hibernateに指示する場所と方法です。

4

3 に答える 3

1

私にも問題があります。MySQL のみを使用するテーブルが 1 つあります。データには 50 万行が含まれます。

Spring Roo を使用して、チュートリアルに従ってすべてのスクリプトを実行し、リバース エンジニアリングとすべてをセットアップします。サーバー稼働時。に移動しlocalhost:8080、正常に実行されます。しかしList All、Javaヒープスペースをクリックしてください!

于 2012-11-09T09:32:53.773 に答える
0

Roo スクリプトとテーブル Unidad および Area の定義を共有できますか?

申し訳ありませんが、見る時間がありませんでしたが、コードを見ると、Hibernate アノテーションを使用していることがわかります: FetchMode.SELECT でフェッチします。何のために?

一般に、エンジンに依存するのは得策ではありません。さらに、望ましくない動作を引き起こしている可能性があります。

一見すると、JPA アノテーション Fetch.LAZY は目的に十分に思えます。

于 2012-06-15T04:05:29.353 に答える
0
import javax.persistence.FetchType
@ManyToOne (fetch = FetchType.LAZY)

なぜこれがうまくいかなかったのかわかりません。使用したばかりで、遅延読み込みになりました。生成された .aj ファイルを変更する場所。その場合、Roo は次のスキャンでそれを再生成します。その場合は、.java ファイルにプッシュする必要があります。

于 2012-12-04T21:34:23.680 に答える