-->
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.  [ 1 post ] 
Author Message
 Post subject: Duplicated items on mapped collection
PostPosted: Wed Jan 18, 2012 4:46 am 
Newbie

Joined: Wed Jan 18, 2012 4:20 am
Posts: 1
I have following Entities:
Code:
/*CREATE TABLE `card_type_tmp` (
  `id` int(11) NOT NULL auto_increment,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;*/

@Entity
@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.TRANSACTIONAL)
@Table(name = "card_type_tmp")
public class CardType {@Id
    @GeneratedValue
    @Column(name = "id", nullable = false, updatable = false)
    private int                      id     = 0;

    @OneToMany(cascade = { CascadeType.REMOVE }, mappedBy = "cardType", fetch = FetchType.LAZY)
    private List<EmDefinition> emColl = new ArrayList<EmDefinition>();

    public List<EmDefinition> getEmColl() {
        return emColl;
    }

    public int getId() {
        return id;
    }

Code:
/*CREATE TABLE `em_def_tmp` (
  `id` int(11) NOT NULL auto_increment,
   card_type_id int(11),
  dev_param_id int(11),
  PRIMARY KEY (`id`),
CONSTRAINT cardtypeFK FOREIGN KEY (card_type_id) REFERENCES card_type_tmp(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;*/
@Entity
@Table(name = "em_def_tmp")
@NamedQuery(name = EmDefinition.NQ_FIND_BY_DEVICE_PARAM_ID_AND_CARD_TYPE_ID, query = "SELECT e FROM EmDefinition e WHERE e.dparamId=:dParamId AND e.cardType.id = :cardTypeId")
public class EmDefinition{
public static final String NQ_FIND_BY_DEVICE_PARAM_ID_AND_CARD_TYPE_ID = "EmDefinition,findByDeviceParamAndCardType";

    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false)
    private int      id = 0;

    @JoinColumn(name = "card_type_id", referencedColumnName = "id", updatable = false)
    @ManyToOne(cascade = {}, fetch = FetchType.LAZY)
    private CardType cardType;

    @Column(name = "dev_param_id")
    private int      dparamId;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public CardType getCardType() {
        return cardType;
    }

    public void setCardType(CardType cardType) {
        this.cardType = cardType;
    }
    public int getDparamId() {
        return dparamId;
    }

    public void setDparamId(int dparamId) {
        this.dparamId = dparamId;
    }
}


and two sessionBeans
Code:
@Stateless
public class SessionBean1 implements SessionBean1Local, SessionBean1Remote {

    @PersistenceContext(unitName = "TestPU")
    private EntityManager     em       = null;

    @EJB
    @org.jboss.annotation.IgnoreDependency
    private SessionBean2Local sessionL = null;

    private int addDefinitions(CardType card) {
//System.out.println("the 'size' value is: " + card.getEmColl().size()); //when uncommenting this printing - the result is 6 always - WHY?????
        sessionL.addDefinitions(card);
        int i = 0;
        System.out.println("the 'size' value is: " + card.getEmColl().size());
        for (EmDefinition def : card.getEmColl()) {
            System.out.println("definitionId:" + def.getId()); //there is 7 objects printed on screen (the last two are the same)
            i++;
        }
        System.out.println("the 'i' value is: " + i);
        return i;
    }

    private CardType createCardType() {
        CardType cardType = new CardType();
        em.persist(cardType);
        return cardType;
    }

    public int createCard() {
        return this.createCardType().getId();
    }

    public int addDefinitions(int cardTypeId) {
        CardType card = em.find(CardType.class, cardTypeId);
        return this.addDefinitions(card);
    }
}


Code:
@Stateless
public class SessionBean2 implements SessionBean2Local {

    @PersistenceContext(unitName = "AirSyncPU")
    private EntityManager em = null;

    @Override
    public void addDefinitions(CardType card) {
        for (int i = 0; i < 6; i++) {
            this.addDefinition(card, i);
        }
    }

    private void addDefinition(CardType card, int dParamId) {
        EmDefinition def = findByDeviceParamIdAndCardTypeId(dParamId, card.getId());
        if (def == null) {
            def = new EmDefinition();
            def.setCardType(card);
            def.setDparamId(dParamId);
            def.setId(0);           
            card.getEmColl().add(def);
            em.persist(def);
        } else {
            def.setDparamId(dParamId);
        }

        /////////////////////// WRONG BEHAViours. WHY?????????????????????
        //EmDefinition def = null;
        // em.persist(def);
        //card.getEmColl().add(def);
        //results with 12 objects on the list
       
        //EmDefinition def = findByDeviceParamIdAndCardTypeId(dParamId, card.getId());
        // em.persist(def);
        //card.getEmColl().add(def);
        //results with 7 objects on the list
       
        //EmDefinition def = findByDeviceParamIdAndCardTypeId(dParamId, card.getId());
        //card.getEmColl().add(def);
        //em.persist(def);
        //results with 7 of object on the list - the order does not matter
    }

    private EmDefinition findByDeviceParamIdAndCardTypeId(int dParamId, int cardTypeId) {
        Query q = em.createNamedQuery(EmDefinition.NQ_FIND_BY_DEVICE_PARAM_ID_AND_CARD_TYPE_ID);
        q.setParameter("cardTypeId", cardTypeId);
        q.setParameter("dParamId", dParamId);

        try {
            return (EmDefinition) q.getSingleResult();
        } catch (NoResultException e) {
            return null;
        }
    }
}


My test
Code:
@Test
    public void test() throws NamingException {
        int card = getSessionBean1Remote().createCard();
        int definitionsNo= getSessionBean1Remote().addDefinitions(card);
        System.out.println(definitionsNo);
    }


while calling getSessionBean1Remote().addDefinitions(card); I add by hand ONLY 6 definitions (database is filled with 6 definitions) but... in SessionBean1 where I call card.getEmColl().size() and print it to the logs there is 7 objects and test results with returned 'definitionsNo' equals to 7.

I turned hibernate logs to TRACE and this is what I got:
2012-01-18 08:22:40,294 TRACE [org.hibernate.event.def.DefaultInitializeCollectionEventListener] initializing collection [com.tests.dupliactes.CardType.emColl#28]
2012-01-18 08:22:40,294 TRACE [org.hibernate.event.def.DefaultInitializeCollectionEventListener] checking second-level cache
2012-01-18 08:22:40,294 TRACE [org.hibernate.event.def.DefaultInitializeCollectionEventListener] collection not cached
2012-01-18 08:22:40,294 DEBUG [org.hibernate.loader.Loader] loading collection: [com.tests.dupliactes.CardType.emColl#28]
2012-01-18 08:22:40,294 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2012-01-18 08:22:40,294 DEBUG [org.hibernate.jdbc.ConnectionManager] opening JDBC connection
2012-01-18 08:22:40,294 DEBUG [org.hibernate.SQL] select emcoll0_.card_type_id as card3_1_, emcoll0_.id as id1_, emcoll0_.id as id1_0_, emcoll0_.card_type_id as card3_1_0_, emcoll0_.dev_param_id as dev2_1_0_ from em_def_tmp emcoll0_ where emcoll0_.card_type_id=?
2012-01-18 08:22:40,294 TRACE [org.hibernate.jdbc.AbstractBatcher] preparing statement
2012-01-18 08:22:40,295 TRACE [org.hibernate.type.IntegerType] binding '28' to parameter: 1
.......
2012-01-18 08:22:40,300 DEBUG [org.hibernate.loader.Loader] result row: EntityKey[com.tests.dupliactes.EmDefinition#133]
...
2012-01-18 08:22:40,301 DEBUG [org.hibernate.loader.Loader] result row: EntityKey[com.tests.dupliactes.EmDefinition#134]
..
2012-01-18 08:22:40,302 DEBUG [org.hibernate.loader.Loader] result row: EntityKey[com.tests.dupliactes.EmDefinition#135]
...
2012-01-18 08:22:40,303 DEBUG [org.hibernate.loader.Loader] result row: EntityKey[com.tests.dupliactes.EmDefinition#136]
...
2012-01-18 08:22:40,303 DEBUG [org.hibernate.loader.Loader] result row: EntityKey[com.tests.dupliactes.EmDefinition#137]
...
2012-01-18 08:22:40,304 DEBUG [org.hibernate.loader.Loader] result row: EntityKey[com.tests.dupliactes.EmDefinition#138]
....
2012-01-18 08:22:40,304 DEBUG [org.hibernate.loader.Loader] found row of collection: [com.tests.dupliactes.CardType.emColl#28]
2012-01-18 08:22:40,304 TRACE [org.hibernate.engine.loading.CollectionLoadContext] starting attempt to find loading collection [[com.tests.dupliactes.CardType.emColl#28]]
2012-01-18 08:22:40,304 TRACE [org.hibernate.engine.loading.LoadContexts] attempting to locate loading collection entry [CollectionKey[com.tests.dupliactes.CardType.emColl#28]] in any result-set context
2012-01-18 08:22:40,304 TRACE [org.hibernate.engine.loading.LoadContexts] collection [CollectionKey[com.tests.dupliactes.CardType.emColl#28]] not located in load context
2012-01-18 08:22:40,304 TRACE [org.hibernate.engine.loading.CollectionLoadContext] found loading collection bound to current result set processing; reading row
2012-01-18 08:22:40,304 TRACE [org.hibernate.type.IntegerType] returning '138' as column: id1_
2012-01-18 08:22:40,304 TRACE [org.hibernate.event.def.DefaultLoadEventListener] loading entity: [com.tests.dupliactes.EmDefinition#138]
2012-01-18 08:22:40,304 TRACE [org.hibernate.event.def.DefaultLoadEventListener] attempting to resolve: [com.tests.dupliactes.EmDefinition#138]
2012-01-18 08:22:40,304 TRACE [org.hibernate.event.def.DefaultLoadEventListener] resolved object in session cache: [com.tests.dupliactes.EmDefinition#138]
2012-01-18 08:22:40,304 TRACE [org.hibernate.loader.Loader] done processing result set (6 rows)
2012-01-18 08:22:40,304 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close ResultSet (open ResultSets: 1, globally: 1)
2012-01-18 08:22:40,304 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2012-01-18 08:22:40,304 TRACE [org.hibernate.jdbc.AbstractBatcher] closing statement
2012-01-18 08:22:40,305 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection
2012-01-18 08:22:40,305 DEBUG [org.hibernate.jdbc.ConnectionManager] releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
2012-01-18 08:22:40,305 TRACE [org.hibernate.loader.Loader] total objects hydrated: 0
2012-01-18 08:22:40,305 TRACE [org.hibernate.engine.loading.LoadContexts] attempting to locate loading collection entry [CollectionKey[com.tests.dupliactes.CardType.emColl#28]] in any result-set context
2012-01-18 08:22:40,305 TRACE [org.hibernate.engine.loading.LoadContexts] collection [CollectionKey[com.tests.dupliactes.CardType.emColl#28]] not located in load context
2012-01-18 08:22:40,305 TRACE [org.hibernate.engine.loading.CollectionLoadContext] removing collection load entry [org.hibernate.engine.loading.LoadingCollectionEntry<rs=com.mysql.jdbc.JDBC4ResultSet@6405b42e, coll=[com.tests.dupliactes.CardType.emColl#28]>@56de8a94]
2012-01-18 08:22:40,305 DEBUG [org.hibernate.engine.loading.CollectionLoadContext] 1 collections were found in result set for role: com.tests.dupliactes.CardType.emColl
2012-01-18 08:22:40,305 DEBUG [org.hibernate.engine.loading.CollectionLoadContext] ending loading collection [org.hibernate.engine.loading.LoadingCollectionEntry<rs=com.mysql.jdbc.JDBC4ResultSet@6405b42e, coll=[com.tests.dupliactes.CardType.emColl#28]>@56de8a94]
2012-01-18 08:22:40,305 DEBUG [org.hibernate.engine.loading.CollectionLoadContext] collection fully initialized: [com.tests.dupliactes.CardType.emColl#28]
2012-01-18 08:22:40,305 DEBUG [org.hibernate.engine.loading.CollectionLoadContext] 1 collections initialized for role: com.tests.dupliactes.CardType.emColl
2012-01-18 08:22:40,305 DEBUG [org.hibernate.engine.StatefulPersistenceContext] initializing non-lazy collections
2012-01-18 08:22:40,305 DEBUG [org.hibernate.loader.Loader] done loading collection
2012-01-18 08:22:40,305 TRACE [org.hibernate.event.def.DefaultInitializeCollectionEventListener] collection initialized
2012-01-18 08:22:40,308 INFO [STDOUT] the 'size' value is: 7
2012-01-18 08:22:40,308 INFO [STDOUT] definitionId:133
2012-01-18 08:22:40,308 INFO [STDOUT] definitionId:134
2012-01-18 08:22:40,308 INFO [STDOUT] definitionId:135
2012-01-18 08:22:40,308 INFO [STDOUT] definitionId:136
2012-01-18 08:22:40,308 INFO [STDOUT] definitionId:137
2012-01-18 08:22:40,308 INFO [STDOUT] definitionId:138
2012-01-18 08:22:40,308 INFO [STDOUT] definitionId:138
2012-01-18 08:22:40,308 INFO [STDOUT] the 'i' value is: 7
2012-01-18 08:22:40,308 TRACE [org.hibernate.transaction.CacheSynchronization] transaction before completion callback
2012-01-18 08:22:40,309 TRACE [org.hibernate.jdbc.JDBCContext] before transaction completion
2012-01-18 08:22:40,309 TRACE [org.hibernate.impl.SessionImpl] before transaction completion
2012-01-18 08:22:40,309 TRACE [org.hibernate.ejb.AbstractEntityManagerImpl] automatically flushing session
2012-01-18 08:22:40,309 TRACE [org.hibernate.impl.SessionImpl] automatically flushing session
2012-01-18 08:22:40,309 TRACE [org.hibernate.event.def.AbstractFlushingEventListener] flushing session
2012-01-18 08:22:40,309 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] processing flush-time cascades
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.CardType
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] done processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.CardType
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] done processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] done processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] done processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] done processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] done processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 TRACE [org.hibernate.engine.Cascade] done processing cascade ACTION_PERSIST_ON_FLUSH for: com.tests.dupliactes.EmDefinition
2012-01-18 08:22:40,309 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] dirty checking collections
2012-01-18 08:22:40,309 DEBUG [org.hibernate.engine.CollectionEntry] Collection dirty: [com.tests.dupliactes.CardType.emColl#28]
2012-01-18 08:22:40,310 TRACE [org.hibernate.event.def.AbstractFlushingEventListener] Flushing entities and processing referenced collections
2012-01-18 08:22:40,310 DEBUG [org.hibernate.engine.Collections] Collection found: [com.tests.dupliactes.CardType.emColl#28], was: [com.tests.dupliactes.CardType.emColl#28] (initialized)
2012-01-18 08:22:40,310 TRACE [org.hibernate.event.def.AbstractFlushingEventListener] Processing unreferenced collections
2012-01-18 08:22:40,310 TRACE [org.hibernate.event.def.AbstractFlushingEventListener] Scheduling collection removes/(re)creates/updates
2012-01-18 08:22:40,310 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 insertions, 0 updates, 0 deletions to 7 objects
2012-01-18 08:22:40,310 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 (re)creations, 1 updates, 0 removals to 1 collections
2012-01-18 08:22:40,310 DEBUG [org.hibernate.pretty.Printer] listing entities:
2012-01-18 08:22:40,310 DEBUG [org.hibernate.pretty.Printer] com.tests.dupliactes.EmDefinition{id=137, dparamId=4, cardType=com.tests.dupliactes.CardType#28}
2012-01-18 08:22:40,310 DEBUG [org.hibernate.pretty.Printer] com.tests.dupliactes.EmDefinition{id=136, dparamId=3, cardType=com.tests.dupliactes.CardType#28}
2012-01-18 08:22:40,310 DEBUG [org.hibernate.pretty.Printer] com.tests.dupliactes.EmDefinition{id=138, dparamId=5, cardType=com.tests.dupliactes.CardType#28}
2012-01-18 08:22:40,310 DEBUG [org.hibernate.pretty.Printer] com.tests.dupliactes.EmDefinition{id=133, dparamId=0, cardType=com.tests.dupliactes.CardType#28}
2012-01-18 08:22:40,311 DEBUG [org.hibernate.pretty.Printer] com.tests.dupliactes.CardType{id=28, emColl=[com.tests.dupliactes.EmDefinition#133, com.tests.dupliactes.EmDefinition#134, com.tests.dupliactes.EmDefinition#135, com.tests.dupliactes.EmDefinition#136, com.tests.dupliactes.EmDefinition#137, com.tests.dupliactes.EmDefinition#138, com.tests.dupliactes.EmDefinition#138]}
2012-01-18 08:22:40,311 DEBUG [org.hibernate.pretty.Printer] com.tests.dupliactes.EmDefinition{id=135, dparamId=2, cardType=com.tests.dupliactes.CardType#28}
2012-01-18 08:22:40,311 DEBUG [org.hibernate.pretty.Printer] com.tests.dupliactes.EmDefinition{id=134, dparamId=1, cardType=com.tests.dupliactes.CardType#28}
2012-01-18 08:22:40,311 TRACE [org.hibernate.event.def.AbstractFlushingEventListener] executing flush
2012-01-18 08:22:40,311 TRACE [org.hibernate.jdbc.ConnectionManager] registering flush begin
2012-01-18 08:22:40,311 TRACE [org.hibernate.jdbc.ConnectionManager] registering flush end
2012-01-18 08:22:40,311 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection
2012-01-18 08:22:40,311 TRACE [org.hibernate.event.def.AbstractFlushingEventListener] post flush
2012-01-18 08:22:40,335 TRACE [org.hibernate.impl.SessionImpl] closing session
2012-01-18 08:22:40,335 TRACE [org.hibernate.jdbc.ConnectionManager] connection already null in cleanup : no action
2012-01-18 08:22:40,335 TRACE [org.hibernate.transaction.CacheSynchronization] transaction after completion callback, status: 3
2012-01-18 08:22:40,335 TRACE [org.hibernate.jdbc.JDBCContext] after transaction completion
2012-01-18 08:22:40,335 TRACE [org.hibernate.impl.SessionImpl] after transaction completion

The line 2012-01-18 08:22:40,311 DEBUG [org.hibernate.pretty.Printer] com.tests.dupliactes.CardType{id=28, emColl=[com.tests.dupliactes.EmDefinition#133, com.tests.dupliactes.EmDefinition#134, com.tests.dupliactes.EmDefinition#135, com.tests.dupliactes.EmDefinition#136, com.tests.dupliactes.EmDefinition#137, com.tests.dupliactes.EmDefinition#138, com.tests.dupliactes.EmDefinition#138]} has duplicated objects!

My question is why the returned value is 7. Whats more : take a look at my comments in code of SessionBean1. When I add printing cardType.getEmColl().size() in this specified place the collection size and returned value is always 6. How to solve this issue without using flush or refresh??


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

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.