我似乎有一个很奇怪的问题。我在JSP中显示用户及其角色。由于某些原因,仅在首次加载页面时显示角色。我刷新页面,所有角色都从数据库中删除!
我的设置是标准的Spring MVC,JPA + Hibernate(基于Spring Data)应用程序。(Spring 3.2.x,Hibernate
4.1.8)
我有两个实体- User
并且Role
如下图所示(假设getter和setter方法)
@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 Data仓库,它没有定义任何额外的方法。
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>
我在这里错过明显的东西吗?
由于您发布的代码似乎正确,因此我猜这里。
我建议的第一件事是删除此初始化(这似乎是删除角色的唯一位置),这本身通常是一个好主意(请参阅下面的评论),我认为这可能会干扰hibernate.enable_lazy_load_no_trans=true
已知的泄漏连接。过去:
private Set<Role> roles = new HashSet<>();
第二种尝试是检查是否还用mapBedBy注释了ManyToMany关系的反面以及发生了什么变化。
第三次尝试是,如果急于加载该集合解决了该问题(甚至使FactType,Hibernate.initialize()任意使用)解决了该问题(甚至进一步加剧了enable_lazy_load_no_trans位置)。
最后一个是摆脱enable_lazy_load_no_trans并使用OpenSessionInView
编辑:啊,最后一个,您可能*有此错误(受影响的hibernate4.1.8和4.1.9):https
:
//hibernate.onjira.com/browse/HHH-7971
因此,使用4.1.7射击可能会带来更好的结果(或可能更糟)。
*
可能的意图是:“您的案例是如此相似,因此邀请您将代码作为测试案例发送到错误报告中”。
我正在使用Hibernate JPA运行本机查询并返回结果列表。 我想要获取的结果列表并添加到映射中以供将来处理,但是返回的映射仅包含ResultList中的最后一项。 如何让结果列表在地图中添加多个条目? --编辑-- 预期地图内容: 940 7107877 940 7107664 940 7112778 940 7112479 940 7114678 940 7113504 println输出
我试图在一个Jasper报告中显示多个表,我使用子报告来实现这个功能。但我一直在显示几个子报告。实际上,只显示其中一个(第一个)。 以下是我的主report.jrxml: 下面是subjectSubreport.jrxml: 这是printersSubreport.jrxml: 当我切换子报告时,第一个报告正确显示,另一个报告消失。在JasperSoft Studio中,一切都很好,当我将它们导出
我在discord中为我的机器人发出了afk命令。py,但是当我执行Afk命令时,ping代码时只有1个单词https://nekobin.com/sulotolise 形象
我的挂机命令工作得很好,除了我只能使用一个词原因。例如,我会说-afk遛狗。每当有人在我挂机的不和谐服务器上定位我时,它只会说(用户)如果afk。原因:走路。我正在想办法让它说多个单词而不是一个。这是我的AFK命令 @客户。_消息(消息)上的事件异步定义:全局afkdict if消息。afkdict作者:afkdict。pop(message.author)
当我输入一个字符串运算符时,无论是加法()、减法(-)、乘法(*)、除法(/)还是模块(%),即使我输入了一个有效的输入,它仍然会进入而循环。我不知道问题可能是什么,因为当循环工作正常时,我必须为变量Num2输入一个int值。
问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严