2 Replies Latest reply on Oct 15, 2008 10:01 AM by fgc_fernando

    OneToMany + JoinTable versioning

      Hello Folks,

      I'm having a problem with versioning of a OneToMany relationship + JoinTable with envers.

      Consider these classes:
      (A Person can have many pets, but a pet belongs to just one Person.)

      Person:

      // imports omitted for brevity...
      
      @Versioned
      @Entity
      public class Person {
       @Id
       @GeneratedValue(strategy=GenerationType.SEQUENCE)
       @Column(name="person_id")
       private long id;
      
       @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
       @JoinTable(name="person_pet",
       joinColumns=@JoinColumn(name="person_id",referencedColumnName="person_id"),
       inverseJoinColumns=@JoinColumn(name="pet_id",referencedColumnName="pet_id"))
       private Set<Pet> pets;
      
       public Person(){
       this.pets = new HashSet<Pet>();
       }
      
       // gets and sets omitted for brevity...
      }
      



      Pet:
      // imports omitted for brevity...
      
      @Versioned
      @Entity
      public class Pet {
       @Id
       @GeneratedValue(strategy=GenerationType.SEQUENCE)
       @Column(name="pet_id")
       private long id;
      
       private String name;
      
       public Pet(){}
      
       // gets and sets omitted for brevity...
      }
      


      When I generate the database, envers creates a table called "person_pet_versions" which is supposed to contain the changes in the relationship between persons and pets.

      The problem is that when I associate persons with pets, nothing is inserted into "person_pet_versions" table.

      The test code:
      // imports omitted for brevity...
      
      public class Test {
       public static void main(String[] args) {
       EntityManagerFactory emf = Persistence.createEntityManagerFactory("testenvers");
       EntityManager em = emf.createEntityManager();
       EntityTransaction tx = em.getTransaction();
       try
       {
       tx.begin();
      
       Person me = new Person();
       me.getPets().add(new Pet("Fido"));
       me.getPets().add(new Pet("Max"));
      
       em.persist(me);
      
       tx.commit();
       }
       finally
       {
       if (tx.isActive())
       {
       tx.rollback();
       }
      
       em.close();
       }
       }
      }
      


      After executing the Test class, all the data is in the database, but the person_pet_versions table is empty.

      I'm using:
      Envers 1.1.0 beta2 for hibernate 3.3
      Hibernate 3.3.1.GA

      I already tested:
      Envers 1.1.0 beta 2
      Envers 1.1.0 beta 1
      with
      Hibernate 3.2.6

      The docs say that a OneToMany + JoinTable versioning should work in envers 1.1.0 beta.

      Am I doing something wrong?

      Thanks in advance

      by the way, this is an excelent framework. Its saving me a lot of time ;)