懒加载奇怪的行为

时间:2012-02-01 23:41:34

标签: java hibernate spring jpa lazy-loading

我正在使用spring-mvc创建Web应用程序[图层:控制器 - >服务 - > DAO - >实体]和我遇到了延迟加载的问题,这使我得以缓冲。通常存在以下关系。我有一个帐户[实体]可以有很多单词[实体],很多单词可以分配给许多帐户,所以这是@ManyToMany。

帐户实体

  @Entity
  @Table(name = "account")
  @Inheritance(strategy = InheritanceType.JOINED)
  public class Account {

  ...

  @ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Word.class)
  @JoinTable(name = "account_word", joinColumns = {@JoinColumn(name="account_id")}, inverseJoinColumns = {@JoinColumn(name="word_id")})
  private List<Word> words;

  public List<Word> getWords() {
      return words;
  }

  public void setWords(List<Word> words) {
      this.words = words;
  }
  }

Word实体

  @Entity
  @Table(name = "word")
  @Inheritance(strategy = InheritanceType.JOINED)
  public class Word {

  ...

  @Basic
  @NotBlank
  @Column(name = "word")
  private String word;

  @ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
  @JoinTable(name = "account_word", joinColumns = {@JoinColumn(name="word_id")}, inverseJoinColumns = {@JoinColumn(name="account_id")})
  private List<Account> accounts;

  public List<Account> getAccounts() {
      return accounts;
  }

  public void setAccounts(List<Account> accounts) {
      this.accounts = accounts;
  }

  ...

  }

案例是当用户登录时我想在视图中显示他的话。我有:

控制器类

  @Controller
  @RequestMapping(value="/words")
  public class WordsController {

  @Autowired
  AccountService accountService;

  @Autowired
  WordService wordService;

  @RequestMapping(method=RequestMethod.GET)
  public ModelAndView showWords(Principal principal) {

      ModelAndView model = new ModelAndView("words");
      Word word = new Word();
      List<Word> accountWords = new ArrayList<Word>();

      accountWords.addAll(wordService.listUserWords(principal.getName()));

      model.addObject("word", word);
      model.addObject("accountWords", accountWords);

      return model;
  }

服务类

  @Transactional
  @Service
  public class WordServiceImpl implements WordService {

  private static final Logger logger = LoggerFactory.getLogger(WordServiceImpl.class);

  @Autowired
  AccountDao accountDao;

  @PersistenceContext
  EntityManager entityManager;

  @Override
  @Transactional(propagation = Propagation.REQUIRED)
  public Collection<Word> listUserWords(String username) {
      try {
          Account foundAccount = accountDao.findUser(username);
          List<Word> userWords = foundAccount.getWords();
          for (Word word : userWords) {
              logger.info("Word: " + word.getWord());
          }
          return userWords;
      } catch (UserNotFoundException unf) {
          logger.error("User not found: " + username);
      }
      return null;
  }
  }

DAO课程

  @Repository
  public class AccountDaoImpl implements AccountDao {

  @PersistenceContext
  private EntityManager entityManager;
  private CriteriaBuilder cb;

  @PostConstruct
  private void init() {
      cb = entityManager.getCriteriaBuilder();
  }

  @Override
  public Account findUser(String username) throws UserNotFoundException {
      CriteriaQuery<Account> c = cb.createQuery(Account.class);
      Root<Account> r = c.from(Account.class);
      try {
          c.select(r).where(cb.equal(r.get("username"), username));
          Account foundAccount = entityManager.createQuery(c).getSingleResult();
          return foundAccount;
      } catch(NoResultException nre){
          throw new UserNotFoundException();
      }
  }
  }

JSP视图

  ...
  <ul id="word_list">
      <c:choose>
          <c:when test="${not empty accountWords}">
               <c:forEach items="${accountWords}" var="word" varStatus="status">
                   <li class="word">
                       <span>${word.word}</span>
                   </li>
               </c:forEach>
          </c:when>
      </c:choose>
  </ul>
  ...

在我的Service类中,我想使用Lazy加载但是有非常奇怪的行为。片段:

   for (Word word : userWords) {
        logger.info("Word: " + word.getWord());
   }

仅用于测试,但它至关重要!没有它我得到 LazyInitializationException ,我找不到发生这种情况的原因。当我评论这个片段时,我得到了:

  [StatefulPersistenceContext] - initializing non-lazy collections
  [Loader] - loading collection: [model.Account.roles#104]
  [AbstractBatcher] - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
  [SQL] - select roles0_.account_id as account2_9_1_, roles0_.role_id as role1_1_, role1_.role_id as role1_10_0_, role1_.name as name10_0_ from account_role roles0_ inner join role role1_ on roles0_.role_id=role1_.role_id where roles0_.account_id=?
  Hibernate: select roles0_.account_id as account2_9_1_, roles0_.role_id as role1_1_, role1_.role_id as role1_10_0_, role1_.name as name10_0_ from account_role roles0_ inner join role role1_ on roles0_.role_id=role1_.role_id where roles0_.account_id=?
  [AbstractBatcher] - about to open ResultSet (open ResultSets: 0, globally: 0)
  [Loader] - result set contains (possibly empty) collection: [model.Account.roles#104]
  [Loader] - result row: EntityKey[model.Role#2]
  [Loader] - found row of collection: [model.Account.roles#104]
  [AbstractBatcher] - about to close ResultSet (open ResultSets: 1, globally: 1)
  [AbstractBatcher] - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
  [TwoPhaseLoad] - resolving associations for [model.Role#2]
  [TwoPhaseLoad] - done materializing entity [model.Role#2]
  [loading.CollectionLoadContext] - 1 collections were found in result set for role: model.Account.roles
  [loading.CollectionLoadContext] - collection fully initialized: [model.Account.roles#104]
  [loading.CollectionLoadContext] - 1 collections initialized for role: model.Account.roles
  [Loader] - done loading collection
  [org.springframework.orm.jpa.JpaTransactionManager] - Initiating transaction commit
  [org.springframework.orm.jpa.JpaTransactionManager] - Committing JPA transaction on EntityManager [ejb.EntityManagerImpl@6f76dd71]
  [transaction.JDBCTransaction] - commit
  [event.def.AbstractFlushingEventListener] - processing flush-time cascades
  [event.def.AbstractFlushingEventListener] - dirty checking collections
  [Collections] - Collection found: [model.Account.roles#104], was: [model.Account.roles#104] (initialized)
  [Collections] - Collection found: [model.Account.words#104], was: [model.Account.words#104] (uninitialized)
  [Collections] - Collection found: [model.Role.accounts#2], was: [model.Role.accounts#2] (uninitialized)
  [event.def.AbstractFlushingEventListener] - Flushed: 0 insertions, 0 updates, 0 deletions to 2 objects
  [event.def.AbstractFlushingEventListener] - Flushed: 0 (re)creations, 0 updates, 0 removals to 3 collections
  [pretty.Printer] - listing entities:
  [pretty.Printer] - model.Role{accounts=<uninitialized>, name=ROLE_REGISTERED, roleId=2}
  [pretty.Printer] - model.Account{username=mgrodek, registrationDate=2012-01-07 23:15:38.464, accountId=104, words=<uninitialized>, email=mariusz.grodek@gmail.com, roles=[model.Role#2], password=ffd1245c1e1cd7ed0af442ecc9a019e58ff2cbbe4d465b5dc4dc6b8bee16a2bf}
  [transaction.JDBCTransaction] - re-enabling autocommit
  [transaction.JDBCTransaction] - committed JDBC Connection
  [ConnectionManager] - aggressively releasing JDBC connection
  [ConnectionManager] - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
  [com.mchange.v2.resourcepool.BasicResourcePool] - trace com.mchange.v2.resourcepool.BasicResourcePool@4ecb36fa [managed: 5, unused: 4, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@791d9ad)
  [org.springframework.orm.jpa.JpaTransactionManager] - Closing JPA EntityManager [ejb.EntityManagerImpl@6f76dd71] after transaction
  [org.springframework.orm.jpa.EntityManagerFactoryUtils] - Closing JPA EntityManager
  [org.springframework.security.web.context.SecurityContextPersistenceFilter] - SecurityContextHolder now cleared, as request processing completed
  [org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter] - Closing JPA EntityManager in OpenEntityManagerInViewFilter
  [org.springframework.orm.jpa.EntityManagerFactoryUtils] - Closing JPA EntityManager
  2012-02-02 29 org.apache.catalina.core.StandardWrapperValve invoke
  SEVERE: Servlet.service() for servlet [sndServlet] in context with path [/snd] threw exception [Request processing failed; nested exception is LazyInitializationException: failed to lazily initialize a collection of role: model.Account.words, no session or session was closed] with root cause
  LazyInitializationException: failed to lazily initialize a collection of role: model.Account.words, no session or session was closed
    at collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
    at collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
    at collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
    at collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
   ...

但是当我将此片段取消注释时,控制台日志为:

  [Loader] - loading collection: [model.Account.words#104]
  [AbstractBatcher] - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
  [SQL] - select words0_.account_id as account1_9_1_, words0_.word_id as word2_1_, word1_.word_id as word1_8_0_, word1_.counter as counter8_0_, word1_.word as word8_0_ from account_word words0_ inner join word word1_ on words0_.word_id=word1_.word_id where words0_.account_id=?
  Hibernate: select words0_.account_id as account1_9_1_, words0_.word_id as word2_1_, word1_.word_id as word1_8_0_, word1_.counter as counter8_0_, word1_.word as word8_0_ from account_word words0_ inner join word word1_ on words0_.word_id=word1_.word_id where words0_.account_id=?
  [AbstractBatcher] - about to open ResultSet (open ResultSets: 0, globally: 0)
  [Loader] - result set contains (possibly empty) collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#5]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#6]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#7]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#8]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#9]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#10]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#11]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#12]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#13]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#14]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#15]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#18]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#19]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#20]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#21]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#22]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#23]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#24]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#25]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#26]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#27]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#28]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#29]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#30]
  [Loader] - found row of collection: [model.Account.words#104]
  [Loader] - result row: EntityKey[model.Word#31]
  [Loader] - found row of collection: [model.Account.words#104]
  [AbstractBatcher] - about to close ResultSet (open ResultSets: 1, globally: 1)
  [AbstractBatcher] - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
  [TwoPhaseLoad] - resolving associations for [model.Word#5]
  [TwoPhaseLoad] - done materializing entity [model.Word#5]
  [TwoPhaseLoad] - resolving associations for [model.Word#6]
  [TwoPhaseLoad] - done materializing entity [model.Word#6]
  [TwoPhaseLoad] - resolving associations for [model.Word#7]
  [TwoPhaseLoad] - done materializing entity [model.Word#7]
  [TwoPhaseLoad] - resolving associations for [model.Word#8]
  [TwoPhaseLoad] - done materializing entity [model.Word#8]
  [TwoPhaseLoad] - resolving associations for [model.Word#9]
  [TwoPhaseLoad] - done materializing entity [model.Word#9]
  [TwoPhaseLoad] - resolving associations for [model.Word#10]
  [TwoPhaseLoad] - done materializing entity [model.Word#10]
  [TwoPhaseLoad] - resolving associations for [model.Word#11]
  [TwoPhaseLoad] - done materializing entity [model.Word#11]
  [TwoPhaseLoad] - resolving associations for [model.Word#12]
  [TwoPhaseLoad] - done materializing entity [model.Word#12]
  [TwoPhaseLoad] - resolving associations for [model.Word#13]
  [TwoPhaseLoad] - done materializing entity [model.Word#13]
  [TwoPhaseLoad] - resolving associations for [model.Word#14]
  [TwoPhaseLoad] - done materializing entity [model.Word#14]
  [TwoPhaseLoad] - resolving associations for [model.Word#15]
  [TwoPhaseLoad] - done materializing entity [model.Word#15]
  [TwoPhaseLoad] - resolving associations for [model.Word#18]
  [TwoPhaseLoad] - done materializing entity [model.Word#18]
  [TwoPhaseLoad] - resolving associations for [model.Word#19]
  [TwoPhaseLoad] - done materializing entity [model.Word#19]
  [TwoPhaseLoad] - resolving associations for [model.Word#20]
  [TwoPhaseLoad] - done materializing entity [model.Word#20]
  [TwoPhaseLoad] - resolving associations for [model.Word#21]
  [TwoPhaseLoad] - done materializing entity [model.Word#21]
  [TwoPhaseLoad] - resolving associations for [model.Word#22]
  [TwoPhaseLoad] - done materializing entity [model.Word#22]
  [TwoPhaseLoad] - resolving associations for [model.Word#23]
  [TwoPhaseLoad] - done materializing entity [model.Word#23]
  [TwoPhaseLoad] - resolving associations for [model.Word#24]
  [TwoPhaseLoad] - done materializing entity [model.Word#24]
  [TwoPhaseLoad] - resolving associations for [model.Word#25]
  [TwoPhaseLoad] - done materializing entity [model.Word#25]
  [TwoPhaseLoad] - resolving associations for [model.Word#26]
  [TwoPhaseLoad] - done materializing entity [model.Word#26]
  [TwoPhaseLoad] - resolving associations for [model.Word#27]
  [TwoPhaseLoad] - done materializing entity [model.Word#27]
  [TwoPhaseLoad] - resolving associations for [model.Word#28]
  [TwoPhaseLoad] - done materializing entity [model.Word#28]
  [TwoPhaseLoad] - resolving associations for [model.Word#29]
  [TwoPhaseLoad] - done materializing entity [model.Word#29]
  [TwoPhaseLoad] - resolving associations for [model.Word#30]
  [TwoPhaseLoad] - done materializing entity [model.Word#30]
  [TwoPhaseLoad] - resolving associations for [model.Word#31]
  [TwoPhaseLoad] - done materializing entity [model.Word#31]
  [loading.CollectionLoadContext] - 1 collections were found in result set for role: model.Account.words
  [loading.CollectionLoadContext] - collection fully initialized: [model.Account.words#104]
  [loading.CollectionLoadContext] - 1 collections initialized for role: model.Account.words
  [StatefulPersistenceContext] - initializing non-lazy collections
  [Loader] - done loading collection
  INFO  [service.WordServiceImpl] - Word: anetka
  INFO  [service.WordServiceImpl] - Word: anetka
  INFO  [service.WordServiceImpl] - Word: anetka
  INFO  [service.WordServiceImpl] - Word: lolo
  INFO  [service.WordServiceImpl] - Word: test
  INFO  [service.WordServiceImpl] - Word: jazda
  INFO  [service.WordServiceImpl] - Word: aloza
  INFO  [service.WordServiceImpl] - Word: tata
  INFO  [service.WordServiceImpl] - Word: jestok
  INFO  [service.WordServiceImpl] - Word: test
  INFO  [service.WordServiceImpl] - Word: tesss
  INFO  [service.WordServiceImpl] - Word: słowo
  INFO  [service.WordServiceImpl] - Word: hmm
  INFO  [service.WordServiceImpl] - Word: hmh
  INFO  [service.WordServiceImpl] - Word: ggd
  INFO  [service.WordServiceImpl] - Word: yyy
  INFO  [service.WordServiceImpl] - Word: yyy
  INFO  [service.WordServiceImpl] - Word: chyba
  INFO  [service.WordServiceImpl] - Word: sdsad
  INFO  [service.WordServiceImpl] - Word: pup
  INFO  [service.WordServiceImpl] - Word: hm
  INFO  [service.WordServiceImpl] - Word: ateraz
  INFO  [service.WordServiceImpl] - Word: gj
  INFO  [service.WordServiceImpl] - Word: test
  INFO  [service.WordServiceImpl] - Word: test
   [org.springframework.orm.jpa.JpaTransactionManager] - Initiating transaction commit
   [org.springframework.orm.jpa.JpaTransactionManager] - Committing JPA transaction on EntityManager [ejb.EntityManagerImpl@1c910477]
   [transaction.JDBCTransaction] - commit
   [event.def.AbstractFlushingEventListener] - processing flush-time cascades
  [event.def.AbstractFlushingEventListener] - dirty checking collections
  [Collections] - Collection found: [model.Account.roles#104], was: [model.Account.roles#104] (initialized)
  [Collections] - Collection found: [model.Account.words#104], was: [model.Account.words#104] (initialized)
  [Collections] - Collection found: [model.Role.accounts#2], was: [model.Role.accounts#2] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#5], was: [model.Word.accounts#5] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#6], was: [model.Word.accounts#6] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#7], was: [model.Word.accounts#7] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#8], was: [model.Word.accounts#8] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#9], was: [model.Word.accounts#9] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#10], was: [model.Word.accounts#10] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#11], was: [model.Word.accounts#11] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#12], was: [model.Word.accounts#12] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#13], was: [model.Word.accounts#13] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#14], was: [model.Word.accounts#14] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#15], was: [model.Word.accounts#15] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#18], was: [model.Word.accounts#18] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#19], was: [model.Word.accounts#19] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#20], was: [model.Word.accounts#20] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#21], was: [model.Word.accounts#21] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#22], was: [model.Word.accounts#22] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#23], was: [model.Word.accounts#23] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#24], was: [model.Word.accounts#24] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#25], was: [model.Word.accounts#25] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#26], was: [model.Word.accounts#26] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#27], was: [model.Word.accounts#27] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#28], was: [model.Word.accounts#28] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#29], was: [model.Word.accounts#29] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#30], was: [model.Word.accounts#30] (uninitialized)
  [Collections] - Collection found: [model.Word.accounts#31], was: [model.Word.accounts#31] (uninitialized)
  [event.def.AbstractFlushingEventListener] - Flushed: 0 insertions, 0 updates, 0 deletions to 27 objects
  [event.def.AbstractFlushingEventListener] - Flushed: 0 (re)creations, 0 updates, 0 removals to 28 collections
  [pretty.Printer] - listing entities:
  [pretty.Printer] - model.Account{username=mgrodek, registrationDate=2012-01-07 23:15:38.464, accountId=104, words=[model.Word#5, model.Word#6, model.Word#7, model.Word#8, model.Word#9, model.Word#10, model.Word#11, model.Word#12, model.Word#13, model.Word#14, model.Word#15, model.Word#18, model.Word#19, model.Word#20, model.Word#21, model.Word#22, model.Word#23, model.Word#24, model.Word#25, model.Word#26, model.Word#27, model.Word#28, model.Word#29, model.Word#30, model.Word#31], email=mariusz.grodek@gmail.com, roles=[model.Role#2], password=ffd1245c1e1cd7ed0af442ecc9a019e58ff2cbbe4d465b5dc4dc6b8bee16a2bf}
  [pretty.Printer] - model.Word{id=31, accounts=<uninitialized>, counter=1, word=test}
  [pretty.Printer] - model.Word{id=30, accounts=<uninitialized>, counter=1, word=test}
  [pretty.Printer] - model.Word{id=27, accounts=<uninitialized>, counter=1, word=hm}
  [pretty.Printer] - model.Word{id=26, accounts=<uninitialized>, counter=1, word=pup}
  [pretty.Printer] - model.Word{id=29, accounts=<uninitialized>, counter=1, word=gj}
  [pretty.Printer] - model.Word{id=28, accounts=<uninitialized>, counter=1, word=ateraz}
  [pretty.Printer] - model.Role{accounts=<uninitialized>, name=ROLE_REGISTERED, roleId=2}
  [pretty.Printer] - model.Word{id=5, accounts=<uninitialized>, counter=1, word=anetka}
  [pretty.Printer] - model.Word{id=9, accounts=<uninitialized>, counter=1, word=test}
  [pretty.Printer] - model.Word{id=8, accounts=<uninitialized>, counter=1, word=lolo}
  [pretty.Printer] - model.Word{id=7, accounts=<uninitialized>, counter=1, word=anetka}
  [pretty.Printer] - model.Word{id=6, accounts=<uninitialized>, counter=1, word=anetka}
  [pretty.Printer] - model.Word{id=20, accounts=<uninitialized>, counter=1, word=hmh}
  [pretty.Printer] - model.Word{id=21, accounts=<uninitialized>, counter=1, word=ggd}
  [pretty.Printer] - model.Word{id=18, accounts=<uninitialized>, counter=1, word=słowo}
  [pretty.Printer] - model.Word{id=19, accounts=<uninitialized>, counter=1, word=hmm}
  [pretty.Printer] - model.Word{id=24, accounts=<uninitialized>, counter=1, word=chyba}
  [pretty.Printer] - model.Word{id=25, accounts=<uninitialized>, counter=1, word=sdsad}
  [pretty.Printer] - model.Word{id=22, accounts=<uninitialized>, counter=1, word=yyy}
  [pretty.Printer] - model.Word{id=23, accounts=<uninitialized>, counter=1, word=yyy}
  [transaction.JDBCTransaction] - re-enabling autocommit
  [transaction.JDBCTransaction] - committed JDBC Connection
  [ConnectionManager] - aggressively releasing JDBC connection
  [ConnectionManager] - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
  [com.mchange.v2.resourcepool.BasicResourcePool] - trace com.mchange.v2.resourcepool.BasicResourcePool@3918d722 [managed: 5, unused: 4, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5bb77832)
  [org.springframework.orm.jpa.JpaTransactionManager] - Closing JPA EntityManager [ejb.EntityManagerImpl@1c910477] after transaction
  [org.springframework.orm.jpa.EntityManagerFactoryUtils] - Closing JPA EntityManager
  [org.springframework.security.web.access.ExceptionTranslationFilter] - Chain processed normally
  [org.springframework.security.web.context.SecurityContextPersistenceFilter] - SecurityContextHolder now cleared, as request processing completed
  [org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter] - Closing JPA EntityManager in OpenEntityManagerInViewFilter
  [org.springframework.orm.jpa.EntityManagerFactoryUtils] - Closing JPA EntityManager

将单词传递给视图,一切正确。为什么会这样?有人可以帮助我吗,因为我不想让我的代码中的这个片段与记录器一起了。

也许抓取时存在一些问题并且延迟加载无法正常工作?我的服务类中有@Transactional,我使用OpenEntityManagerInViewFilter。最后,这是我的web.xml文件的简短版本:

的web.xml

      <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:jee="http://www.springframework.org/schema/jee"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

      <filter>
          <filter-name>JpaFilter</filter-name>
          <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>JpaFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>

      <display-name>snd</display-name>

      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>     

      <servlet>
          <servlet-name>sndServlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      </servlet>

      <servlet-mapping>
          <servlet-name>sndServlet</servlet-name>
          <url-pattern>*.html</url-pattern>
      </servlet-mapping>

  </web-app>

2 个答案:

答案 0 :(得分:2)

您的服务类和方法标记为@Transactional,当您在事务中执行hibernate操作时,hibernate会话处于打开状态,当您访问属性时,您的映射使@ManyToMany端加载为Lazy循环中延迟加载对象的> ,会话是开放的,因此hibernate能够初始化代理并为你获取它们,因此它们也可以在视图上工作,因为它们被正确初始化而不是惰性对象。

当您对代码发表评论时,它们是惰性代理,当您尝试在视图中访问它们时,该实体的属性即 word ,它会尝试获取它但是为时已晚hibernate会话处于活动状态,因此是例外。

将其调整为FetchType.EAGER并查看差异。

希望这会有所帮助......

答案 1 :(得分:0)

也许这是一个老问题,但它让我陷入了大麻烦:)。

但我的观点是,一旦entitymanager / persistencecontext被关闭,那么对Entity的引用应该被视为普通的POJO类,因为它完全不受持久化上下文的影响。那么作为一个简单的POJO,为什么它关注懒惰的加载呢?

相关问题