0

I have created a web application to manage a veterinary clinic with Spring Roo and Gvnix tools.
I created the database with the tables veterinary , owners, pets, dating, all these tables relate to 1 to many , except the table treatments and medicines that relate many to many, these 2 tables above include an intermediate table , called _treatment_med_ which serves to interact between them , use database manager MySQL workbench and MYSQL Server , everything works perfect , from the web application forms I create, update and delete owners, pets, veterinarians, dating, medications but when I try to create more than 2 records on table treatments doing a multiple selection in drugs that have related to the table through treatments a tag jspx.

<field:select field="Med"  id="c_com_clinicaveterinaria_dam_domain_Tratamiento_Med" itemValue="id" items="${medicamentoses}" multiple="true" path="/medicamentoses" z="+hr+pOBWxfr2whYp+joa+OMxAHk="/>  

The application gives me an error without detail of because and I drop by full

I see process from the task manager of Windows with Java (TM) platform SE Binary name (java.exe) soars to more than +1,800 KB (private working space), which makes the web application fall.

Problem in this part of code in the AspectJ class for persistence of the Gvnix with the name.

privileged aspect TratamientoBatchService_Roo_GvNIXJpaBatch {

I think that the error is here.

@Transactional
public void TratamientoBatchService.create(List<Tratamiento> tratamientoes) {
for( Tratamiento tratamiento : tratamientoes) {
    tratamiento.persist();
}
}  

This is error showing me the IntelliJ IDE console:

Stacktrace:] with root cause java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:421)
at java.lang.StringBuffer.append(StringBuffer.java:272)
at org.apache.commons.lang3.builder.ToStringStyle.appendFieldSeparator(ToStringStyle.java:1503)
at org.apache.commons.lang3.builder.ToStringStyle.appendFieldEnd(ToStringStyle.java:1526)
at org.apache.commons.lang3.builder.ToStringStyle.append(ToStringStyle.java:439)
at org.apache.commons.lang3.builder.ToStringBuilder.append(ToStringBuilder.java:848)
at org.apache.commons.lang3.builder.ReflectionToStringBuilder.appendFieldsIn(ReflectionToStringBuilder.java:522)  
at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:683)
at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:282) 
at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:145) 
at com.clinicaveterinaria.dam.domain.Citas_Roo_ToString.ajc$interMethod$com_clinicaveterinaria_dam_domain_Citas_Roo_ToString$com_clinicaveterinaria_dam_domain_Citas$toString(Citas_Roo_ToString.aj:13)
at com.clinicaveterinaria.dam.domain.Citas.toString(Citas.java:1)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuffer.append(StringBuffer.java:265)
at org.apache.commons.lang3.builder.ToStringStyle.appendDetail(ToStringStyle.java:586)
at org.apache.commons.lang3.builder.ToStringStyle.appendInternal(ToStringStyle.java:550)
at org.apache.commons.lang3.builder.ToStringStyle.append(ToStringStyle.java:436)
at org.apache.commons.lang3.builder.ToStringBuilder.append(ToStringBuilder.java:848)
at org.apache.commons.lang3.builder.ReflectionToStringBuilder.appendFieldsIn(ReflectionToStringBuilder.java:522)
at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:683)
at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:282)
at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:145)
at com.clinicaveterinaria.dam.domain.Tratamiento_Roo_ToString.ajc$interMethod$com_clinicaveterinaria_dam_domain_Tratamiento_Roo_ToString$com_clinicaveterinaria_dam_domain_Tratamiento$toString(Tratamiento_Roo_ToString.aj:13)
at com.clinicaveterinaria.dam.domain.Tratamiento.toString(Tratamiento.java:1)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:317)
at java.lang.String.valueOf(String.java:2994)  

I've tried to configure the Maven server from the IDE IntelliJ IDEA to increase the amount of memory that can withstand through "- Xmx512m - XX:MaxPermSize = 128 m" but the problem cannot be solved.

This is my class Java : Tratamiento.java

package com.clinicaveterinaria.dam.domain;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.jpa.activerecord.RooJpaActiveRecord;
import org.springframework.roo.addon.tostring.RooToString;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@RooJavaBean
@RooToString
@RooJpaActiveRecord
public class Tratamiento {

/**
 */
@NotNull
@Size(min = 5, max = 100)
private String Codigo;
/**
 */
@Size(min = 3, max = 250)
private String AnalisisClinicos;

/**
 */
@Size(min = 3, max = 250)
private String Medicamentos;

/**
 */
private double Coste;

/**
 */
@Size(min = 3, max = 250)
private String Diagnostico;

/**
 */
@Size(min = 3, max = 250)
private String MotivoIngreso;

/**
 */
@NotNull
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(style = "M-")
private Date FechaComienzoTratamiento;

/**
 */
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(style = "M-")
private Date FechaFinTratamiento;

/**
 */
@ManyToOne
private Citas citas;

/**
 */
@ManyToMany(cascade = CascadeType.ALL)
private Set<Medicamentos> Med = new HashSet<Medicamentos>();


public static List<Tratamiento> findTratamientoXDueño(int idUsr) {
    if (idUsr <= 0 /*mas comprobaciones*/) return null;
    Query query = entityManager().createNativeQuery(
            " SELECT t.* FROM tratamiento t " +
                    " INNER JOIN citas c ON c.id = t.citas " +
                    " INNER JOIN mascota m ON m.id = c.mascotas " +
                    " WHERE m.duenio = (:idUsr)"
            , Tratamiento.class).setParameter("idUsr", idUsr);
    return query.getResultList();
}

public static List<Tratamiento> findTratamientoXVeterinario(int idUsr) {
    if (idUsr <= 0 /*mas comprobaciones*/) return null;
    Query query = entityManager().createNativeQuery(
            " SELECT t.* FROM tratamiento t " +
                    " INNER JOIN citas c ON c.id = t.citas " +
                    " WHERE c.veterinarios = (:idUsr)"
            , Tratamiento.class).setParameter("idUsr", idUsr);
    return query.getResultList();
}
}

Thank you by the help , i am doing the final course project.
I am using MVC (Model–view–controller).
Sorry , my english is very bad.

Raúl Vela
  • 49
  • 7
  • Can you post the `Tratamiento` class? –  Jun 05 '16 at 12:36
  • Yes , now I put the code. – Raúl Vela Jun 05 '16 at 12:38
  • What you have there is an OutOfMemoryError. It is caused by a memory leak in your app. But the stack trace is completely irrelevant: the error could have happened anywhere else. You need to use a profiler, or carful code analysis, to understand why the memory used by the app keeps growing and growing. You're probably keeping objects in a collection or map, and never clearing it. – JB Nizet Jun 05 '16 at 12:40

1 Answers1

0

The solution is override the method toString.

package com.clinicaveterinaria.dam.domain;

import com.clinicaveterinaria.dam.domain.Tratamiento;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

privileged aspect Tratamiento_Roo_ToString {
public String Tratamiento.toString() {
return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}    
}

New method toString.

 package com.clinicaveterinaria.dam.domain;

import com.clinicaveterinaria.dam.domain.Tratamiento;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

privileged aspect Tratamiento_Roo_ToString {

public String Tratamiento.toString() {
return "";
  }
}

Now the app web doesn´t fall

Raúl Vela
  • 49
  • 7
  • you *Shouldn't* modify _.aj_ files because it's used by Spring Roo and *will override this change* next time you start the _console_. The right way to solve your problem is definie `toString` inside `Tratamiento.java`. Spring Roo detects that this method is declared already on `.java` file and *will not regenerate* it. – jmvivo Jun 06 '16 at 07:57
  • See _.aj_ files header: `// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. // You may push code into the target .java compilation unit if you wish to edit any member(s)` – jmvivo Jun 06 '16 at 08:04