Package org.hibernate.test.annotations.immutable

Source Code of org.hibernate.test.annotations.immutable.ImmutableTest

//$Id$
package org.hibernate.test.annotations.immutable;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.AnnotationException;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.test.annotations.TestCase;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Tests for <code>Immutable</code> annotation.
*
* @author Hardy Ferentschik
*/
@SuppressWarnings("unchecked")
public class ImmutableTest extends TestCase {

  private Logger log = LoggerFactory.getLogger(ImmutableTest.class);

  public ImmutableTest(String x) {
    super(x);
  }

  public void testImmutableEntity() throws Exception {
    Session s = openSession();
    Transaction tx = s.beginTransaction();
    Country country = new Country();
    country.setName("Germany");
    s.persist(country);
    tx.commit();
    s.close();

    // try changing the entity
    s = openSession();
    tx = s.beginTransaction();
    Country germany = (Country) s.get(Country.class, country.getId());
    assertNotNull(germany);
    germany.setName("France");
    assertEquals("Local name can be changed", "France", germany.getName());
    s.save(germany);
    tx.commit();
    s.close();
   
    // retrieving the country again - it should be unmodified
    s = openSession();
    tx = s.beginTransaction();
    germany = (Country) s.get(Country.class, country.getId());
    assertNotNull(germany);
    assertEquals("Name should not have changed", "Germany", germany.getName());
    tx.commit();
    s.close();
   
//    // try deletion
//    s = openSession();
//    tx = s.beginTransaction();
//    s.delete(germany);
//    tx.commit();
//    s.close();
//   
//    s = openSession();
//    tx = s.beginTransaction();
//    germany = (Country) s.get(Country.class, country.getId());
//    assertNotNull(germany);
//    assertEquals("Name should not have changed", "Germany", germany.getName());
//    s.close();
  }
 
  public void testImmutableCollection() {
    Country country = new Country();
    country.setName("Germany");
    List states = new ArrayList<State>();
    State bayern = new State();
    bayern.setName("Bayern");
    State hessen = new State();
    hessen.setName("Hessen");
    State sachsen = new State();
    sachsen.setName("Sachsen");
    states.add(bayern);
    states.add(hessen);
    states.add(sachsen);
    country.setStates(states);
   
    Session s = openSession();
    Transaction tx = s.beginTransaction();
    s.persist(country);
    tx.commit();
    s.close();
   
    s = openSession();
    tx = s.beginTransaction();
    Country germany = (Country) s.get(Country.class, country.getId());
    assertNotNull(germany);
    assertEquals("Wrong number of states", 3, germany.getStates().size());
   
    // try adding a state
    State foobar = new State();
    foobar.setName("foobar");
    s.save(foobar);
    germany.getStates().add(foobar);
    try {
      tx.commit();
      fail();
    } catch (HibernateException e) {
      assertTrue(e.getMessage().contains("changed an immutable collection instance"));
      log.debug("success");
    }
    s.close();
   
    s = openSession();
    tx = s.beginTransaction();
    germany = (Country) s.get(Country.class, country.getId());
    assertNotNull(germany);
    assertEquals("Wrong number of states", 3, germany.getStates().size());
   
    // try deleting a state
    germany.getStates().remove(0);
    try {
      tx.commit();
      fail();
    } catch (HibernateException e) {
      assertTrue(e.getMessage().contains("changed an immutable collection instance"));
      log.debug("success");
   
    s.close()
   
    s = openSession();
    tx = s.beginTransaction();
    germany = (Country) s.get(Country.class, country.getId());
    assertNotNull(germany);
    assertEquals("Wrong number of states", 3, germany.getStates().size());
    tx.commit();
    s.close();
  }
 
  public void testMiscplacedImmutableAnnotation() {
    try {
      AnnotationConfiguration config = new AnnotationConfiguration();
      config.addAnnotatedClass(Foobar.class);
      config.buildSessionFactory();
      fail();
    } catch (AnnotationException ae) {
      log.debug("succes");
    }
  }
 
  /**
   * @see org.hibernate.test.annotations.TestCase#getAnnotatedClasses()
   */
  protected Class[] getAnnotatedClasses() {
    return new Class[] { Country.class, State.class};
  }
}
TOP

Related Classes of org.hibernate.test.annotations.immutable.ImmutableTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.