我似乎有一個相當奇怪的問題。我在JSP中顯示用戶和他們的角色。出於某種原因,角色僅在首次加載頁面時顯示。我刷新頁面,角色都從數據庫中刪除!爲什麼Hibernate刪除我的收藏條目時,我所做的只是一個列表?
我的設置是標準的Spring MVC,JPA + Hibernate(通過Spring數據)應用程序。 (彈簧3.2.x中,休眠4.1.8)
我有兩個實體 - User
和Role
,如下所示(假設setter和getter)
@Entity
public class User {
@Id
@GeneratedValue
private int id;
private String name;
@ManyToMany
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
}
@Entity
public class Role {
@Id
private String id;
private String name;
}
我有一個Spring數據存儲庫,其不定義任何額外的方法。
public interface UserRepository extends CrudRepository<User, Integer> {
}
我有一個服務和一個控制器,其相關方法如下。
// service
@Transactional(readOnly = true)
public Iterable<User> findAll() {
return userRepository.findAll();
}
// controller
@RequestMapping
public String showUsers(ModelMap model) {
model.put("users", userService.findAll());
return "admin/users";
}
在我的JSP中,我試圖顯示所有的用戶和任何關聯的角色。
<c:forEach var="user" items="${users}">
<tr>
<td>${user.name}</td>
<td>
<c:forEach var="role" items="${user.roles}">
${role.name}
</c:forEach>
</td>
</tr>
</c:forEach>
就像我剛纔所說,在我user_role
表中的記錄本頁面已經被渲染之後被刪除。
啓用後DEBUG
爲org.hibernate
和啓用查詢日誌記錄,這裏是我在日誌中發現:
22:36:25 DEBUG Collection dereferenced: [com.adarshr.domain.User.roles#1] [Collections.java:76]
22:36:25 DEBUG Flushed: 0 insertions, 0 updates, 0 deletions to 2 objects [AbstractFlushingEventListener.java:117]
22:36:25 DEBUG Flushed: 0 (re)creations, 0 updates, 1 removals to 1 collections [AbstractFlushingEventListener.java:124]
22:36:25 DEBUG Deleting collection: [com.adarshr.domain.User.roles#1] [AbstractCollectionPersister.java:1124]
22:36:25 DEBUG
delete
from
user_role
where
user_id=? [SqlStatementLogger.java:104]
22:36:25 DEBUG Done deleting collection [AbstractCollectionPersister.java:1182]
很顯然有鬼是怎麼回事。爲什麼我的收藏首先被取消了?
這是我的JPA實體管理器工廠定義。
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="mainDataSource" />
<property name="packagesToScan" value="com.adarshr.domain" />
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.format_sql=${hibernate.format.sql}
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
hibernate.show_sql=${hibernate.show.sql}
hibernate.enable_lazy_load_no_trans=true
</value>
</property>
</bean>
這裏我錯過了一些東西明顯?
你從哪裏得到「enable_lazy_load_no_trans」?我能找到的關於它的是人們說這是很有問題的,不推薦使用。 – 2013-03-06 05:15:46
從http://stackoverflow.com/questions/578433/how-to-solve-lazy-initialization-exception-using-jpa-and-hibernate-as-provider – adarshr 2013-03-06 07:22:29
「謹慎使用是一種輕描淡寫!」 「這實際上只是一個以基準爲目標的功能......」「......在一般用途中這是一個非常糟糕的主意。」 「冒自己的風險。」 「......它不是我們真正認爲人們應該使用而不知道可能的後果的功能。」 https://hibernate.onjira.com/browse/HHH-7457嗯,你感覺到那裏的主題嗎?不要使用它。 – 2013-03-06 13:33:37