gpt4 book ai didi

java - 如何解决不使用 fetch=FetchType.EAGER 的 lazyinitializationexception?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:39:38 24 4
gpt4 key购买 nike

我仍然收到异常 lazyinitializationexception。是的,我知道这意味着,当我或其他人试图访问该集合时, session 已关闭。不,OpenEntityManagerInViewFilter 不起作用。是的,@ManyToOne(fetch=FetchType.EAGER) 有所帮助,但我不想使用它,因为它会一直自动感染。

我还能怎么做?

附言: 我正在将 HibernateEntityManger 与带注释类的 jpa 一起使用。

更新这是我的代码,首先我有 4 张 table :用户(ID、名字、姓氏、电子邮件……)角色(ID,姓名,评论....)用户角色(用户 ID、角色 ID)邮件(id,user_id,subject,message,to_id...)

一个用户可以有多个角色....用户实体

@Entity
@Table(name = "USERS")
public class User implements GenericDomain{

public static final String _ID = "id";
private Long id;
private String firstName;
private String lastName;
private String email;
private Set<Role> roles = new HashSet<Role>(0);

/* Constructors */
public User() {
}

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID", unique = true, nullable = false)
public Long getId() { return this.id; }
public void setId(Long id) { this.id = id; }

@Column(name="FIRST_NAME", nullable = false, length = 64)
@NotEmpty
@Length(min = 4, max = 45)
public String getFirstName() { return this.firstName; }
public void setFirstName(String firstname) { this.firstName = firstname; }

@Column(name="LAST_NAME", nullable = false, length = 64)
@NotEmpty
@Length(min = 4, max = 45)
public String getLastName() { return this.lastName; }
public void setLastName(String lastname) { this.lastName = lastname; }

@Column(name="EMAIL", unique = false, length = 64)
@Email
@NotEmpty
@Length(min = 4, max = 45)
public String getEmail() { return this.email; }
public void setEmail(String email) { this.email = email; }

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name = "USERS_ROLES"
, joinColumns = { @JoinColumn(name = "user_id") }
, inverseJoinColumns = { @JoinColumn(name = "role_id") }
)
public Set<Role> getRoles() {
return this.roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}

/*@Override toString/equals/hascode */

角色实体

@Entity
@Table(name = "ROLES")
public class Role implements GenericDomain {
private Long id;
private String name;
private String comment;
private Set<User> users = new HashSet<User>(0);

public Role() {
}

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID", unique = true, nullable = false)
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }

@Column(name="NAME", nullable = false, length = 64)
@NotEmpty
@Length(min = 1, max = 32)
public String getName() { return name; }
public void setName(String name) { this.name = name; }

@Column(name="COMMENT", nullable = true, length = 256)
@Length(min = 0, max = 255)
public String getComment() { return this.comment; }
public void setComment(String comment) { this.comment = comment;}

@ManyToMany(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER)
@JoinTable(
name = "USERS_ROLES"
, joinColumns = { @JoinColumn(name = "role_id") }
, inverseJoinColumns = { @JoinColumn(name = "user_id") }
)
public Set<User> getUsers() {
return this.users;
}
public void setUsers(Set<User> users) {
this.users = users;
}

/*@Override toString/equals/hascode */

邮件

@实体@Table(name = "邮件")公共(public)类 Mail 实现 GenericDomain{

private Long    id;
private String mailSubject;
private String mailContent;
private Long receiverId;
private User user = null;

public Mail(){
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false)
public Long getId(){ return this.id; }
public void setId(Long id){ this.id = id;}

@Column(name = "MAILSUBJECT", nullable = false, length = 63)
@Length(max = 63)
public String getMailSubject(){ return this.mailSubject; }
public void setMailSubject(String mailSubject){ this.mailSubject = mailSubject; }

@Column(name = "MAILCONTENT", nullable = true, length = 255)
@Length(max = 255)
public String getMailContent(){ return this.mailContent; }
public void setMailContent(String mailContent){ this.mailContent = mailContent; }

@Column(name = "RECEIVERID")
public Long getReceiverId(){ return this.receiverId; }
public void setReceiverId(Long receiverId){ this.receiverId = receiverId; }


@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "USER_ID")
@NotNull
public User getUser(){ return this.user; }
public void setUser(User user){ this.user = user; }
}

用户 Controller

@Controller
@RequestMapping("/admin/user")
@SessionAttributes("user")
public class UserController {

private UserService userService;
private RoleService roleService;

@Autowired
public UserController(UserService userService, RoleService roleService) {
this.userService = userService;
this.roleService = roleService;
}
@RequestMapping(value = "edit", method = RequestMethod.GET)
public String editUser(@RequestParam(value="id", required = true) Long id, ModelMap model) {

model.addAttribute("allRoles", roleService.getAll());
model.addAttribute("user", userService.getOne(id));
return "/admin/user/edit";
} }

邮件 Controller

@Controller
@SessionAttributes("mail")
@RequestMapping("/portal/mail")
public class MailController{

@Autowired
private MailService mailService;

@RequestMapping(value = "ajaxLoad", method = RequestMethod.GET)
public @ResponseBody List<Mail> list(@RequestParam(value = "type", required = true) String type){
return mailService.getUserMails((Long) WebHelper.getPrincipal().getUser().getId(),type);
}

我的 web.xml

<filter>
<filter-name>SpringOpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>SpringOpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

用户的 edit.jsp

<select >
<c:forEach items="${allRoles}" var="role">
<option value="${role.id}" <c:if test="${fn:contains(roleSelected, role)}">selected="selected"</c:if> >${role.name}</option>
</c:forEach>
</select>

尽管如此,我的用户 edit.jsp 在 lazy=false 下工作正常。使用 FetchType.EAGER 我无法收到我的任何邮件,我进入了一个循环 stackovrflow,没有 FetchType.EAGER 我得到了那个懒惰的异常。

最佳答案

删除所有的急切并添加这个解决我的问题

    <mvc:interceptors>
<bean class="org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
</mvc:interceptors>

过滤器没用

关于java - 如何解决不使用 fetch=FetchType.EAGER 的 lazyinitializationexception?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4263464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com