Hello,
I am doing JUnit tests with DBunit and H2. The problem is that when I try the tests on H2 it fails, but it works on MySQL. My guess is that there is some problem with the self-referencing relationship. I have an entity called comments which has itslef as a parent. When populating the H2 database, it seems that the parent is null for all the entities, but it shouln't.
Here is the entity code:
Code:
package es.tresw.db.entities;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="COMMENTS")
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID", updatable = false, nullable = false)
private Long id;
@Column(name="DATE", nullable=false)
private Date date;
@Column(name="TEXT", nullable=false, columnDefinition="TEXT")
private String text;
@ManyToOne(optional=true)
@JoinColumn(name="PARENT_ID")
private Comment parent;
@OneToMany(mappedBy="parent", fetch=FetchType.LAZY)
private Set<Comment> answers = new HashSet<Comment>();
@ManyToOne
@JoinColumn(name = "ID_SPORTFACILITY", nullable =true)
public SportFacility sportFacility;
@ManyToOne
@JoinColumn(name = "ID_USER_FROM", nullable =true)
public User userFrom;
@ManyToOne
@JoinColumn(name = "ID_TARGET_USER", nullable =true)
public User userTo;
@ManyToOne
@JoinColumn(name = "ID_CIRCLE", nullable =true)
public Circle circle;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public SportFacility getSportFacility() {
return sportFacility;
}
public void setSportFacility(SportFacility sportFacility) {
this.sportFacility = sportFacility;
}
public User getUserFrom() {
return userFrom;
}
public void setUserFrom(User user) {
this.userFrom = user;
}
public Comment getParent() {
return parent;
}
public void setParent(Comment parent) {
this.parent = parent;
}
public Set<Comment> getAnswers() {
return answers;
}
public void setSubordinates(Set<Comment> answers) {
this.answers = answers;
}
public User getUserTo() {
return userTo;
}
public void setUserTo(User userTo) {
this.userTo = userTo;
}
public Circle getCircle() {
return circle;
}
public void setCircle(Circle circle) {
this.circle = circle;
}
}
Here is the DAO:
Code:
package es.tresw.db.dao.impl;
import java.util.List;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import es.tresw.db.dao.I_ClientDao;
import es.tresw.db.dao.I_CommentDao;
import es.tresw.db.entities.Circle;
import es.tresw.db.entities.Client;
import es.tresw.db.entities.Comment;
import es.tresw.db.entities.Like;
import es.tresw.db.entities.Rental;
import es.tresw.db.entities.SportFacility;
import es.tresw.db.entities.User;
@Repository("commentDao")
public class CommentDao extends GenericDao<Comment, Long> implements I_CommentDao
{
public void loadComments(Comment c)
{
update(c);
c.getAnswers();
}
@Override
public List<Comment> getCommentsSportFacility(SportFacility sf) {
Criteria criteria = getSession().createCriteria(Comment.class);
criteria.createAlias("sportFacility", "sf");
criteria.add(Restrictions.isNull("parent.id"));
criteria.add(Restrictions.eq("sf.id", sf.getId()));
criteria.addOrder(Order.desc("date"));
return (List<Comment>)criteria.list();
}
@Override
public List<Comment> getTimeLineUser(User user, List<Circle> circles) {
Criteria criteria = getSession().createCriteria(Comment.class);
Disjunction completeCondition = Restrictions.disjunction();
completeCondition.add(Restrictions.eq("userFrom.id", user.getId()));
completeCondition.add(Restrictions.eq("userTo.id", user.getId()));
for(Circle c: circles)
{
completeCondition.add(Restrictions.eq("circle.id", c.getId()));
}
criteria.add(completeCondition);
criteria.addOrder(Order.desc("date"));
criteria.add(Restrictions.isNull("parent.id"));
return (List<Comment>)criteria.list();
}
@Override
public boolean hasAnswers(Comment c) {
Criteria criteria = getSession().createCriteria(Comment.class);
criteria.add(Restrictions.eq("parent.id", c.getId()));
return ((Long)criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue()>0;
}
@Override
public List<Comment> getTimeLineGeneral(Circle circle) {
Criteria criteria = getSession().createCriteria(Comment.class);
criteria.add(Restrictions.isNull("parent.id"));
criteria.add(Restrictions.eq("circle.id", circle.getId()));
criteria.addOrder(Order.desc("date"));
return (List<Comment>) criteria.list();
}
}
Here is the Junit test:
Code:
package es.tresw.db.dao;
import static org.junit.Assert.*;
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.hibernate.jdbc.Work;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import es.tresw.db.entities.Circle;
import es.tresw.db.entities.Comment;
import es.tresw.db.entities.SportFacility;
import es.tresw.db.entities.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:intercambia-servlet-test.xml"})
@Transactional
public class TestComments{
@Autowired
private I_SportFacilityDao sportFacilityDao;
@Autowired
private I_UserDao userDao;
@Autowired
private I_CommentDao commentDao;
@Autowired
private I_CircleDao circleDao;
@Before
public void onSetUpInTransaction() throws Exception
{
//Controller for allowing users to perform JDBC using the Connection managed by this Session.
sportFacilityDao.getSession().doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
IDatabaseConnection conn;
try {
conn = new DatabaseConnection(connection);
//Populate the database using the DBunit xml
FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
builder.setDtdMetadata(false);
//this is a hack to bypass constrain validations on delete, this is needed since the only way to populate the database is using @before which is called by every method
if(connection.getMetaData().getDatabaseProductName().equals("H2"))
{
Statement sttmnt = connection.createStatement();
sttmnt.execute("SET REFERENTIAL_INTEGRITY FALSE");
sttmnt.close();
}
IDataSet dataSet= builder.build(new File("src/test/resources/test_comment.xml"));//builder.build(this.getClass().getClassLoader().getResourceAsStream("database.xml"));
//Populate the database
DatabaseOperation.CLEAN_INSERT.execute(conn,dataSet);
//Restore the referecnail integrity
if(connection.getMetaData().getDatabaseProductName().equals("H2"))
{
Statement sttmnt = connection.createStatement();
sttmnt.execute("SET REFERENTIAL_INTEGRITY TRUE");
sttmnt.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Test
public void testGetCommentsSportFacility()
{
SportFacility sp = sportFacilityDao.read(new Long(132));
SportFacility sp1 = sportFacilityDao.read(new Long(359));
assertEquals(2, commentDao.getCommentsSportFacility(sp).size());
assertEquals(0, commentDao.getCommentsSportFacility(sp1).size());
}
@Test
public void testGetTimeLineUser()
{
User u = userDao.read(new Long(1));
User u2 = userDao.read(new Long(2));
User u3 = userDao.read(new Long(3));
Circle c1 = circleDao.read(new Long(1));
Circle c2 = circleDao.read(new Long(2));
List<Circle> circles = new ArrayList<Circle>();
circles.add(c1);
circles.add(c2);
List<Comment> comments = commentDao.getTimeLineUser(u, circles);
assertEquals(7,commentDao.getTimeLineUser(u, circles).size());
assertEquals(4,commentDao.getTimeLineUser(u2, circles).size());
assertEquals(4,commentDao.getTimeLineUser(u3, circles).size());
}
@Test
public void testHasAnswers()
{
Comment c = commentDao.read(new Long(1));
Comment c1 = commentDao.read(new Long(5));
assertTrue(commentDao.hasAnswers(c));
assertFalse(commentDao.hasAnswers(c1));
}
@Test
public void testGetTimeLineGeneral()
{
Circle c = circleDao.read(new Long(1));
Circle c1 = circleDao.read(new Long(2));
Circle c2 = circleDao.read(new Long(3));
assertEquals(1, commentDao.getTimeLineGeneral(c).size());
assertEquals(2, commentDao.getTimeLineGeneral(c1).size());
assertEquals(0, commentDao.getTimeLineGeneral(c2).size());
}
@Test
public void testLoadComments()
{
List<Comment> comments = commentDao.readAll();
for(Comment c: comments)
{
System.out.println("ID " + c.getId());
if(c.getCircle()!=null)
System.out.println("circle " + c.getCircle().getId());
System.out.println("answers" + c.getAnswers().size());
if(c.getParent()!=null)
System.out.println("parent " +c.getParent().getId());
if(c.getSportFacility()!=null)
System.out.println("sp" + c.getSportFacility().getId());
System.out.println(c.getText());
if(c.getUserFrom()!=null)
System.out.println("from " + c.getUserFrom().getId());
if(c.getUserTo()!=null)
System.out.println("to " + c.getUserTo().getId());
}
Comment c = commentDao.read(new Long(1));
commentDao.loadComments(c);
assertEquals(3, c.getAnswers().size());
}
}
Here is the xml to populate the database
Code:
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<province ID="1" HAS_COURT="0" NAME="Sevilla"/>
<municipality ID="1" HAS_COURT="0" NAME="Sevilla" ID_PROVINCE="1"/>
<zone ID="1" NAME="Bami" ID_MUNICIPALITY="1"/>
<administrator_sportfacility ID="1" ADMINISTRATOR="3" SportFacility="132"/>
<court ID="1" CREATED_DATE="2013-11-16 17:39:21.0" LAST_MODIFIED_DATE="2014-01-28 15:43:30.0" LENGTH_RENTAL="90" NAME="Pista Futbol 1" PRICE="10.00" DAYS_CLIENT="0" DAYS_MEMBER="0" HOUR_LIGHTS_ON="0" MAX_MONTH_FOR_MULTIPLES_RENTALS_BY_MEMBER="2" MAX_MONTH_FOR_MULTIPLES_RENTALS_BY_USER="6" MAX_RENTAL_BY_MEMBER="30" MAX_RENTAL_BY_USER="15" MULTIPLE_RENTALS_BY_MEMBER="1" MULTIPLE_RENTALS_BY_USER="1" NUM_DAYS_TO_CLOSE_BY_MEMBER="15" NUM_DAYS_TO_CLOSE_BY_USER="15" NUM_DAYS_TO_OPEN_BY_MEMBER="0" NUM_DAYS_TO_OPEN_BY_USER="0" HOURS_TO_CANCEL_RENTAL_NO_PAID="1" HOURS_TO_CANCEL_RENTAL_NO_PAID_MEMBER="1" RENT_DURATION="0" RESERVATION_TYPE="0" STATE="2" SURFACE="Cemento" ID_COURTTYPE="1" ID_SPORT_FACILITY="132" REFERENCE_CANCEL_DATE="1" REFERENCE_CANCEL_DATE_BY_MEMBER="1"/>
<court ID="2" CREATED_DATE="2013-11-16 17:39:21.0" LENGTH_RENTAL="60" NAME="Pista tenis 2" PRICE="10.00" DAYS_CLIENT="0" DAYS_MEMBER="0" HOUR_LIGHTS_ON="0" MAX_MONTH_FOR_MULTIPLES_RENTALS_BY_MEMBER="2" MAX_MONTH_FOR_MULTIPLES_RENTALS_BY_USER="6" MAX_RENTAL_BY_MEMBER="30" MAX_RENTAL_BY_USER="15" MULTIPLE_RENTALS_BY_MEMBER="1" MULTIPLE_RENTALS_BY_USER="1" NUM_DAYS_TO_CLOSE_BY_MEMBER="0" NUM_DAYS_TO_CLOSE_BY_USER="0" NUM_DAYS_TO_OPEN_BY_MEMBER="30" NUM_DAYS_TO_OPEN_BY_USER="60" HOURS_TO_CANCEL_RENTAL_NO_PAID="24" HOURS_TO_CANCEL_RENTAL_NO_PAID_MEMBER="4" RENT_DURATION="0" RESERVATION_TYPE="0" STATE="2" SURFACE="Cesped Natural" ID_COURTTYPE="7" ID_SPORT_FACILITY="132" REFERENCE_CANCEL_DATE="1" REFERENCE_CANCEL_DATE_BY_MEMBER="2"/>
<court ID="3" CREATED_DATE="2013-11-25 13:52:33.0" LENGTH_RENTAL="60" NAME="pista 1" PRICE="10.00" DAYS_CLIENT="0" DAYS_MEMBER="0" HOUR_LIGHTS_ON="0" MAX_MONTH_FOR_MULTIPLES_RENTALS_BY_MEMBER="2" MAX_MONTH_FOR_MULTIPLES_RENTALS_BY_USER="6" MAX_RENTAL_BY_MEMBER="10" MAX_RENTAL_BY_USER="0" MULTIPLE_RENTALS_BY_MEMBER="1" MULTIPLE_RENTALS_BY_USER="1" NUM_DAYS_TO_CLOSE_BY_MEMBER="0" NUM_DAYS_TO_CLOSE_BY_USER="0" NUM_DAYS_TO_OPEN_BY_MEMBER="30" NUM_DAYS_TO_OPEN_BY_USER="60" RENT_DURATION="0" RESERVATION_TYPE="0" STATE="2" SURFACE="Sin determinar" ID_COURTTYPE="1" ID_SPORT_FACILITY="198"/>
<courttype ID="1" DESCRIPTION="Futbol Sala" NAME="Futbol Sala" ORDEN="1"/>
<courttype ID="2" DESCRIPTION="Padel" NAME="Padel" ORDEN="5"/>
<courttype ID="3" DESCRIPTION="Futbol 7" NAME="Futbol 7" ORDEN="2"/>
<courttype ID="5" DESCRIPTION="Futbol 11" NAME="Futbol 11" ORDEN="3"/>
<courttype ID="6" DESCRIPTION="Baloncesto Cemento" NAME="Baloncesto Cemento" ORDEN="4"/>
<courttype ID="7" DESCRIPTION="Tenis" NAME="Tenis" ORDEN="6"/>
<courttype ID="8" DESCRIPTION="Fronton" NAME="Fronton" ORDEN="7"/>
<courttype ID="9" DESCRIPTION="Voley" NAME="Voley" ORDEN="8"/>
<courttype ID="10" DESCRIPTION="Petanca" NAME="Petanca" ORDEN="9"/>
<courttype ID="11" DESCRIPTION="Squash" NAME="Squash" ORDEN="10"/>
<courttype ID="12" DESCRIPTION="Hockey" NAME="Hockey" ORDEN="11"/>
<courttype ID="13" DESCRIPTION="Rugby" NAME="Rugby" ORDEN="12"/>
<courttype ID="14" DESCRIPTION="Beisbol" NAME="Beisbol" ORDEN="13"/>
<day ID="7" DAY_OF_WEEK="MONDAY" endHour="20:00:00" initHour="10:00:00" ID_TIME_PERIOD="2"/>
<day ID="8" DAY_OF_WEEK="TUESDAY" endHour="20:00:00" initHour="10:00:00" ID_TIME_PERIOD="2"/>
<day ID="9" DAY_OF_WEEK="WEDNESDAY" endHour="20:00:00" initHour="10:00:00" ID_TIME_PERIOD="2"/>
<day ID="10" DAY_OF_WEEK="THURSDAY" endHour="20:00:00" initHour="10:00:00" ID_TIME_PERIOD="2"/>
<day ID="11" DAY_OF_WEEK="FRIDAY" endHour="20:00:00" initHour="10:00:00" ID_TIME_PERIOD="2"/>
<day ID="12" DAY_OF_WEEK="SATURDAY" endHour="20:00:00" initHour="10:00:00" ID_TIME_PERIOD="2"/>
<day ID="27" DAY_OF_WEEK="MONDAY" endHour="23:00:00" initHour="09:00:00" ID_TIME_PERIOD="3"/>
<day ID="28" DAY_OF_WEEK="WEDNESDAY" endHour="23:00:00" initHour="09:00:00" ID_TIME_PERIOD="3"/>
<day ID="29" DAY_OF_WEEK="FRIDAY" endHour="23:00:00" initHour="09:00:00" ID_TIME_PERIOD="3"/>
<day ID="30" DAY_OF_WEEK="TUESDAY" endHour="14:00:00" initHour="10:00:00" ID_TIME_PERIOD="3"/>
<day ID="31" DAY_OF_WEEK="THURSDAY" endHour="13:30:00" initHour="08:00:00" ID_TIME_PERIOD="3"/>
<day ID="32" DAY_OF_WEEK="SATURDAY" endHour="14:30:00" initHour="10:00:00" ID_TIME_PERIOD="3"/>
<day ID="33" DAY_OF_WEEK="SATURDAY" endHour="22:30:00" initHour="17:30:00" ID_TIME_PERIOD="3"/>
<day ID="34" DAY_OF_WEEK="TUESDAY" endHour="23:00:00" initHour="15:00:00" ID_TIME_PERIOD="3"/>
<master_data ID="2" DESCRIPTION="Usted recibirá la factura de pistea cada mes" DATA_GROUP="tipo_pago" DATA_NAME="Mensual" POSITION="2" DATA_VALUE="2"/>
<master_data ID="3" DESCRIPTION="Sin determinar" DATA_GROUP="pavimento" DATA_NAME="Sin determinar" POSITION="1" DATA_VALUE="Sin determinar"/>
<master_data ID="4" DESCRIPTION="Pistas de cemento" DATA_GROUP="pavimento" DATA_NAME="Cemento" POSITION="2" DATA_VALUE="Cemento"/>
<master_data ID="5" DESCRIPTION="Pistas de Cesped Natural" DATA_GROUP="pavimento" DATA_NAME="Cesped Natural" POSITION="3" DATA_VALUE="Cesped Natural"/>
<master_data ID="6" DESCRIPTION="Pistas de Cesped Artificial" DATA_GROUP="pavimento" DATA_NAME="Cesped Artificial" POSITION="4" DATA_VALUE="Cesped Artificial"/>
<master_data ID="7" DESCRIPTION="Pistas de Parqué" DATA_GROUP="pavimento" DATA_NAME="Parqué" POSITION="5" DATA_VALUE="Parqué"/>
<master_data ID="8" DESCRIPTION="Pistas de Hormigon Poroso" DATA_GROUP="pavimento" DATA_NAME="Hormigon Poroso" POSITION="6" DATA_VALUE="Hormigon Poroso"/>
<master_data ID="9" DESCRIPTION="Pistas de Hormigon Pulido" DATA_GROUP="pavimento" DATA_NAME="Hormigon Pulido" POSITION="7" DATA_VALUE="Hormigon Pulido"/>
<master_data ID="10" DESCRIPTION="Pistas de Caucho" DATA_GROUP="pavimento" DATA_NAME="Caucho" POSITION="8" DATA_VALUE="Caucho"/>
<master_data ID="11" DESCRIPTION="Pistas de Albero" DATA_GROUP="pavimento" DATA_NAME="Albero" POSITION="9" DATA_VALUE="Albero"/>
<master_data ID="12" DESCRIPTION="Pistas de Arena de Playa" DATA_GROUP="pavimento" DATA_NAME="Arena de Playa" POSITION="10" DATA_VALUE="Arena de Playa"/>
<master_data ID="13" DESCRIPTION="Usted pagará una comisión fija establecida en nuestra política de precios al mes a modo de cuota fija." DATA_GROUP="tipo_comision" DATA_NAME="Comisión fija" POSITION="1" DATA_VALUE="1"/>
<master_data ID="14" DESCRIPTION="A cada alquiler que se haga de sus pistas deportivas, el usuario final pagará la comisión establecida en nuestra política de precios." DATA_GROUP="tipo_comision" DATA_NAME="Comisión por alquiler" POSITION="2" DATA_VALUE="2"/>
<master_data ID="15" DESCRIPTION="Usted recibirá la factura de pistea cada 3 meses" DATA_GROUP="tipo_pago" DATA_NAME="Trimestral" POSITION="3" DATA_VALUE="3"/>
<master_data ID="16" DESCRIPTION="Usted recibirá la factura de pistea cada 6 meses" DATA_GROUP="tipo_pago" DATA_NAME="Semestral" POSITION="4" DATA_VALUE="4"/>
<master_data ID="17" DESCRIPTION="Usted recibirá la factura de pistea cada 12 meses" DATA_GROUP="tipo_pago" DATA_NAME="Anual" POSITION="5" DATA_VALUE="5"/>
<paymentstype ID="1" DESCRIPTION="Se realizará el pago a través del monedero electrónico de PISTEA" NAME="Monedero Electrónico Pistea" ORDEN="1"/>
<paymentstype ID="2" DESCRIPTION="Se realizará el pago a través del monedero electrónico propio de la instalación" NAME="Monedero Electrónico Propio" ORDEN="2"/>
<paymentstype ID="3" DESCRIPTION="Pago a través de la tarjeta de crédito" NAME="Pasarela de pago" ORDEN="3"/>
<paymentstype ID="4" DESCRIPTION="Pago directo en la instalación deportiva" NAME="Pago en Ventanilla" ORDEN="4"/>
<paymentstype ID="5" DESCRIPTION="Pago por transferencia bancaria" NAME="Transferencia Bancaria" ORDEN="5"/>
<role ID="1" NAME="SuperAdmin"/>
<role ID="2" NAME="User"/>
<role ID="3" NAME="SportFacilityAdmin"/>
<sport_facility ID="132" ADDRESS="C/ Rafael Cansinos Assens nº4 5ºA" ZIP_CODE="41008" ACCOUNT_NUMBER="1111111111" BANK_NAME="uno-e" CONTROL_CODE="11" ENTITY_CODE="1111" OFFICE_CODE="1111" COMMISION_TYPE="1" EMAIL="alejandro.alves@gmail.com" PHONE1="954417080" CREATED_DATE="2013-11-16 17:39:21.0" DESCRIPTION="asdasd asda sdkasd;asd asd;ljk adjas dfasd;lf salkf; s;adlkf jsal;df saldfj lsdafjlsaf l;asddfj lasd;dfasdj flsadflsadfj asdlf" GET_HERE="En coche que está mu lejos" INVOICE_ADDRESS="Rafael cansinos assens " INVOICE_CIF="111111111111" INVOICE_NAME="Pepe Nieto" PAYMENT_METHOD="2" LAST_MODIFIED_DATE="2013-11-16 17:39:21.0" NAME="Sevilla FC" SPORT_FACILITY_INITIAL="1" STATE="2" URL_NAME="sfc" ID_MUNICIPALITY="1" ID_PROVINCE="1" ID_ZONE="1" TYPE_ID="3"/>
<sport_facility ID="359" ADDRESS="calle Atenas, s/n" ZIP_CODE="11690" EMAIL="deportes@olvera.es" PHONE1="956130081" CREATED_DATE="2013-12-08 19:13:02.0" LAST_MODIFIED_DATE="2013-12-08 19:13:02.0" NAME="Olivera" STATE="2" URL_NAME="olvera" ID_MUNICIPALITY="1" ID_PROVINCE="1" TYPE_ID="1"/>
<sport_facility_type ID="1" TYPE="Basico"/>
<sport_facility_type ID="2" TYPE="Informativo"/>
<sport_facility_type ID="3" TYPE="Completo"/>
<sport_facility_type ID="4" TYPE="Comunidad"/>
<time_period ID="3" CLOSED="0" CREATED_DATE="2014-01-14 15:05:00.0" END_DATE="2014-12-31" INIT_DATE="2014-01-01" LAST_MODIFIED_DATE="2014-01-14 15:05:31.0" NAME="2014" ID_SPORT_FACILITY="132"/>
<user USERTYPE="CLIENT" ID="1" ACCEPT_LEGAL_CONDITIONS="1" ACCOUNT_NON_EXPIRED="T" ACCOUNT_NON_LOCKED="T" ACTIVE_EMAIL_NOTIFICATION="T" ACTIVE_SMS_NOTIFICATION="T" EMAIL="alejandro.alves@gmail.com" PHONE1="" CREATED_DATE="2013-10-24 13:32:58.0" CREDENTIALS_NON_EXPIRED="T" ENABLED="T" FIRST_LASTNAME="alves" FULLNAME="alejandro alves " LAST_MODIFIED_DATE="2013-10-24 13:32:58.0" NAME="alejandro" PASSWORD="e5d1883020c6a5339cd007fa1b360b4eff6fc82e" SECOND_LASTNAME="" username="aalvesu " ACTIVE_TOOLTIP="T" DIFFERENT_INVOICE_ADDRESS="0" DNI=""/>
<user USERTYPE="ADMIN" ID="2" ACCEPT_LEGAL_CONDITIONS="1" ACCOUNT_NON_EXPIRED="T" ACCOUNT_NON_LOCKED="T" ACTIVE_EMAIL_NOTIFICATION="T" ACTIVE_SMS_NOTIFICATION="T" EMAIL="alejandro.alves@ope1ncmshispano.com" CREATED_DATE="2013-10-24 13:46:56.0" CREDENTIALS_NON_EXPIRED="T" ENABLED="T" FIRST_LASTNAME="alves" FULLNAME="alejandro alves " LAST_MODIFIED_DATE="2013-10-24 13:46:56.0" NAME="alejandro" PASSWORD="e5d1883020c6a5339cd007fa1b360b4eff6fc82e" SECOND_LASTNAME="" username="superadmin" ACTIVE_TOOLTIP="T" DIFFERENT_INVOICE_ADDRESS="0" DNI=""/>
<user USERTYPE="ADMIN" ID="3" ACCEPT_LEGAL_CONDITIONS="1" ACCOUNT_NON_EXPIRED="T" ACCOUNT_NON_LOCKED="T" ACTIVE_EMAIL_NOTIFICATION="T" ACTIVE_SMS_NOTIFICATION="T" EMAIL="alejandro.alves@ope2ncmshispano.com" CREATED_DATE="2013-10-24 16:46:19.0" CREDENTIALS_NON_EXPIRED="T" ENABLED="T" FIRST_LASTNAME="alves" FULLNAME="alejandro alves " LAST_MODIFIED_DATE="2013-10-24 16:46:19.0" NAME="alejandro" PASSWORD="e5d1883020c6a5339cd007fa1b360b4eff6fc82e" SECOND_LASTNAME="" username="aalves" ACTIVE_TOOLTIP="T" DIFFERENT_INVOICE_ADDRESS="0" DNI=""/>
<user USERTYPE="CLIENT" ID="9" ACCEPT_LEGAL_CONDITIONS="1" ACCOUNT_NON_EXPIRED="T" ACCOUNT_NON_LOCKED="T" ACTIVE_EMAIL_NOTIFICATION="T" ACTIVE_SMS_NOTIFICATION="T" EMAIL="alejandro.alves@opencmshispano.com" PHONE1="9886279" CREATED_DATE="2013-11-22 19:25:55.0" CREDENTIALS_NON_EXPIRED="T" ENABLED="T" FIRST_LASTNAME="alves" FULLNAME="alejandro alves " LAST_MODIFIED_DATE="2013-11-22 19:25:55.0" NAME="alejandro" PASSWORD="4eb4b5db911318611ba56041d3db529a6f83c3f7" SECOND_LASTNAME="" username="rafask" ACTIVE_TOOLTIP="T" DIFFERENT_INVOICE_ADDRESS="0" DNI=""/>
<user_role ID="1" ROLE="2" USER="1"/>
<user_role ID="2" ROLE="1" USER="2"/>
<user_role ID="3" ROLE="3" USER="3"/>
<user_role ID="9" ROLE="2" USER="9"/>
<comments ID="1" DATE="2014-01-22 19:25:57.0" ID_SPORTFACILITY="132" ID_USER_FROM="1" TEXT="Esta instalacion es muy chula"/>
<comments ID="2" DATE="2014-02-01 19:25:57.0" ID_USER_FROM="2" PARENT_ID="1" TEXT="Si que lo es"/>
<comments ID="3" DATE="2014-02-02 19:25:57.0" ID_USER_FROM="3" PARENT_ID="1" TEXT="Me encanta"/>
<comments ID="4" DATE="2014-02-03 19:25:57.0" ID_USER_FROM="2" PARENT_ID="3" TEXT="Po dale cana pirana"/>
<comments ID="5" DATE="2013-11-22 19:25:57.0" ID_USER_FROM="1" ID_SPORTFACILITY="132" TEXT="Po dale cana pirana"/>
<comments ID="6" DATE="2014-01-22 19:25:57.0" ID_CIRCLE="1" ID_USER_FROM="1" TEXT="Esta instalacion es muy chula"/>
<comments ID="7" DATE="2014-02-01 19:25:57.0" ID_USER_FROM="2" PARENT_ID="6" TEXT="Si que lo es"/>
<comments ID="8" DATE="2014-02-02 19:25:57.0" ID_USER_FROM="3" PARENT_ID="1" TEXT="Me encanta"/>
<comments ID="9" DATE="2014-02-03 19:25:57.0" ID_USER_FROM="2" PARENT_ID="3" TEXT="Po dale cana pirana"/>
<comments ID="10" DATE="2013-11-22 19:25:57.0" ID_USER_FROM="3" ID_CIRCLE="2" TEXT="Po dale cana pirana"/>
<comments ID="14" DATE="2013-11-22 19:25:57.0" ID_USER_FROM="3" ID_CIRCLE="2" TEXT="Po dale cana pirana"/>
<comments ID="11" DATE="2014-01-22 19:25:57.0" ID_USER_FROM="1" ID_TARGET_USER="2" TEXT="ERES LA CANA"/>
<comments ID="12" DATE="2014-02-01 19:25:57.0" ID_USER_FROM="2" PARENT_ID="11" TEXT="GRACIAS!!"/>
<comments ID="13" DATE="2014-02-02 19:25:57.0" ID_USER_FROM="3" ID_TARGET_USER="1" TEXT="VAYA GOLAZO EL DE AYER!!"/>
<circle ID="1" ID_ADMIN="1" NAME="Malditos Bastardos" DATE="2014-01-22 19:25:57.0"/>
<circle ID="2" ID_ADMIN="2" NAME="Perracas" DATE="2014-01-22 19:25:57.0"/>
<circle ID="3" ID_ADMIN="3" NAME="Putitas" DATE="2014-01-22 19:25:57.0"/>
<likes ID="1" DATE="2013-11-22 19:25:57.0" ID_USER="1" ID_SPORTFACILITY="132"/>
<likes ID="2" DATE="2013-11-22 19:25:57.0" ID_USER="2" ID_SPORTFACILITY="132"/>
<likes ID="3" DATE="2013-11-22 19:25:57.0" ID_USER="1" ID_COMMENT="1" />
</dataset>