Wat ontbreekt er wanneer een Set null is in plaats van een Hibernate-proxy tijdens integratietests met Springframework?

Ik ben nieuw om te overwinteren en probeer goed te beginnen met testen uit de poort. Ik ben verwend door het gebruiksgemak van Grails op dit gebied ... Ik gebruik Springframework 3.0.6 met Hibernate 3.6.8 en Junit 4.9.

Ik probeer te begrijpen waarom de volgende test de EventAttribute Set in het gebeurtenisobject niet "ziet" als een set HibernateProxy-objecten, maar in plaats daarvan gewoon nul. Als ik de samengestelde eigenschappen van een evenement (eigenschappen die zijn gemaakt met objecten in andere tabellen) volg, zie ik ook geen waarden, maar in plaats daarvan nulwaarden.

Het object slaat prima op in de dao, en ik kan eenvoudige eigenschappen zien (eigenschappen in dezelfde tabel). De assertNotNull mislukt echter in de onderstaande test.

Ik vermoed dat er iets mis is met mijn testconfiguratie, zodat de sessie al is afgesloten. Gedachten?

De modellen:

@Entity
@Table(name = "event")
public class Event {

  /**
      ... some other properties ...
  */

  @OneToMany(mappedBy = "event")
  private Set eventAttributes = new HashSet(0);

  /**
      ... getters and setters ...
  */
}

@Entity
@Table(name = "event_attribute")
public class EventAttribute {

  /**
      ... some other properties ...
  */
  @ManyToOne(fetch = FetchType.LAZY)
  @ForeignKey(name = "FK_event_attribute_event")
  @JoinColumn(name = "event_id", nullable = false)
  private Event event;

  /**
      ... getters and setters ...
  */
}

Mijn testconfiguratie:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("dao-testConfig.xml")
@TransactionConfiguration(defaultRollback = false)
@Transactional
public class EventAttributeDaoTest  {

  @Test
  public void save(){
    EventAttribute eventAttribute = new EventAttribute("a key", "a value", event);
    dao.save(eventAttribute);

    Event event2 = eventDao.getEventById(event.getId());
    assertNotNull(event2.getEventAttributes());
  }
}
1

1 antwoord

Het probleem is dat de winterslaap NIET beide uiteinden van een bidirectionele relatie voor u onderhoudt.

Dus zolang u de gebeurtenis niet echt opnieuw in de database laadt, wordt de set niet bijgewerkt. In uw geval is het probleem dat event2 niet opnieuw uit de database wordt geladen, omdat deze al in de huidige winterslaap-sessie aanwezig is.

You can prove that by assertSame(event2, event) //notice that SAME not only EQUALS

Dus als u de sessie spoelt en wist voordat u de tweede gebeurtenis laadt, wordt de slaapstand echt geladen vanaf de db en maakt u een nieuwe objectinstantie. In dit geval zal het ook de set initaliseren op de manier die u verwacht.

But: I my humble opinion, this is poor code. Better is to maintain both sides of the relationship by hand. So if you create an new EventAttribute, it should itselfe register to the Event, the same for changing. So that in the end the releatinship is correct maintained, even if the Object is not stored in the database.

0
toegevoegd
@Daniel: klinkt vreemd "maar ik zie geen details van een deelnemer." zou je alsjeblieft wat meer details willen posten, zodat de code. (Persistence.xml, Test, ...)
toegevoegd de auteur Ralph, de bron
Dit is goed om te weten. Ik wist niet dat winterslaap exact hetzelfde object aan mij zou retourneren. Mijn probleem is echter iets groter dan dat de set gewoon niet wordt geretourneerd. In de test kan ik verder niets in de objectgrafiek bekijken dan de eenvoudige typen als een onderdeel van het gebeurtenisobject. Ik kan bijvoorbeeld een datum en een ID voor het evenement zien, maar ik kan de details van een deelnemer niet zien.
toegevoegd de auteur Daniel Bower, de bron