-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: @ManyToMany with Map problem
PostPosted: Wed Nov 14, 2007 4:00 pm 
Newbie

Joined: Wed Nov 14, 2007 3:24 pm
Posts: 1
Location: México City
Hi:

I´m adding annotations to a project that used XDoclet, and I´m having trouble migrating a many to many association from XML to annotations.

This is a extract from my POJO without annotations:
Code:
**
* @hibernate.class
*   table="SEGU_COLECCION_FACULTADES"
*   proxy="com.bursatec.seguridad.persistence.model.ColeccionFacultades"
*/
public class ColeccionFacultadesImpl implements ColeccionFacultades {

    private static final long serialVersionUID = 1L;
    /**
     * El identificador de la colección de facultades
     */
    private Long id;
    /**
     * Mapa de las facultades asociadas
     */
    private Map facultades;
   
    public Map getFacultades() {
        return this.facultades;
    }

    public void setFacultades(Map facultades) {
        this.facultades = facultades;
    }...

And here is the POJO with annotations
Code:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "SEGU_COLECCION_FACULTADES")
@SequenceGenerator(name = "foliador", sequenceName = "SEQ_SEGU_COLECCION_FACULTADES")
public class ColeccionFacultadesImpl implements ColeccionFacultades {
    @Transient
    private static final long serialVersionUID = 1L;
    /**
     * El identificador de la colección de facultades
     */
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "foliador")
    @Column(name = "ID_COL")
    private Long id;
    /**
     * Mapa de las facultades asociadas
     */
    @MapKey( name = "nombre")
    @ManyToMany(targetEntity = com.bursatec.seguridad.persistence.model.impl.FacultadImpl.class, cascade = {CascadeType.ALL})
    @JoinTable(name = "SEGU_FACULTAD_COLECCION", joinColumns = {@JoinColumn(name = "ID_COL")}, inverseJoinColumns = {@JoinColumn(name = "ID_FACULTAD")})
    @IndexColumn(name = "FACULTAD_KEY", nullable = false, columnDefinition="VARCHAR2 NOT NULL")
    private Map facultades;
...

In the XDoclet version, the association is mapped with this file:

    <map name="facultades" cascade="save-update"
    table="SEGU_FACULTAD_COLECCION">
    <key column="ID_COL" />
    <index column="FACULTAD_key" type="string" />
    <many-to-many
    class="com.bursatec.seguridad.persistence.model.impl.FacultadImpl"
    column="ID_FACULTAD" />
    </map>

The table "SEGU_FACULTAD_COLECCION" has a not nullable column named "FACULTAD_key", in the XDoclet version it works fine inserting the right values in the db, as the following log shows:
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.SQL - insert into SEGU_FACULTAD_COLECCION (ID_COL, FACULTAD_key, ID_FACULTAD) values (?, ?, ?)
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - reusing prepared statement
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.SQL - insert into SEGU_FACULTAD_COLECCION (ID_COL, FACULTAD_key, ID_FACULTAD) values (?, ?, ?)
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - reusing prepared statement
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.SQL - insert into SEGU_FACULTAD_COLECCION (ID_COL, FACULTAD_key, ID_FACULTAD) values (?, ?, ?)
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.persister.collection.AbstractCollectionPersister - done inserting collection: 3 rows inserted
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - Executing batch size: 3
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - success of batch update unknown: 0
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - success of batch update unknown: 1
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - success of batch update unknown: 2
    2007-11-14 10:36:01,724 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    2007-11-14 10:36:01,739 [main] DEBUG org.hibernate.transaction.JDBCTransaction - re-enabling autocommit
    2007-11-14 10:36:01,739 [main] DEBUG org.hibernate.transaction.JDBCTransaction - committed JDBC Connection
    2007-11-14 10:36:01,739 [main] DEBUG org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
    2007-11-14 10:36:01,739 [main] DEBUG org.hibernate.impl.SessionImpl - disconnecting session
    2007-11-14 10:36:01,739 [main] DEBUG org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
    2007-11-14 10:36:01,755 [main] DEBUG org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
But in the annotations version the "FACULTAD_key" column is ignored and an exception is raised:
    2007-11-14 10:25:37,382 [main] DEBUG org.hibernate.SQL - insert into SEGU_FACULTAD_COLECCION (ID_COL, ID_FACULTAD) values (?, ?)
    Hibernate: insert into SEGU_FACULTAD_COLECCION (ID_COL, ID_FACULTAD) values (?, ?)
    2007-11-14 10:25:37,398 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    2007-11-14 10:25:37,398 [main] DEBUG org.hibernate.util.JDBCExceptionReporter - could not insert collection: [com.bursatec.seguridad.persistence.model.impl.ColeccionFacultadesImpl.facultades#1010652] [insert into SEGU_FACULTAD_COLECCION (ID_COL, ID_FACULTAD) values (?, ?)]
    java.sql.SQLException: ORA-01400: cannot insert NULL into ("ADMINWLES2"."SEGU_FACULTAD_COLECCION"."FACULTAD_KEY")
The value of the Map is assigned in child classes of the POJO (in the addFacultad method):
Code:
@Entity
@Table(name = "SEGU_ROL")
@PrimaryKeyJoinColumn(name = "ID_COL")
public class RolImpl extends ColeccionFacultadesImpl implements Rol {
   
   
    @Column(name = "NOMBRE", length = 20)
    private String nombre;
   
   
    public String getNombre() {
        return this.nombre;
    }
   
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
   
   
    public void addFacultad(Facultad facultad) {
       if(this.getFacultades() == null) {
          this.setFacultades(new HashMap());
       }
       this.getFacultades().put(facultad.getNombre(), facultad);
    }
}


This is my configuration:

Hibernate Core 3.2.2.ga
Annotations 3.3.0.ga
Oracle Dialect

I´ve been looking in the documentation and the forums for a couple of days, I believe the the "translated" mapping is right (but maybe I´m wrong) since I can retrieve the Map from a test case that selects it, the problem is in the insertion part.

Any help would be apreciated.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Mar 11, 2008 10:26 am 
Beginner
Beginner

Joined: Fri Oct 06, 2006 2:49 am
Posts: 25
Hello Jorge,

I have currently the same problem as you, except that for me the map is a collectionOfElements

Code:
@CollectionOfElements(fetch=FetchType.LAZY, targetElement=MyClazz.class)
    @JoinTable(name="join_table", joinColumns={@JoinColumn(name="mycol_id")})
    @org.hibernate.annotations.MapKey(columns=@Column(name="mykey"), targetElement=MyClazz.class)
    @IndexColumn(name = "position", base = 0)


did you find a workaround for this (other than to use a list ;) )?

Thx a lot,
Tiggy[/code]


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.