我做了相当多的研究,由于某种原因它对我不起作用我什至没有进入我得到“僵尸”实例的情况(比如存在于会话中但不再存在于数据库中 - 我希望我有这种情况)因为remove()没有传播到数据库中。子记录继续存在于我的数据库中。
考虑两个表:User和Token(FK_User_Id),分别是一对多的关系
内部 DAO 最终代码不起作用:
public void deleteToken(Token t) {
Token b = em.merge(t);
em.remove(b); // does nothing
em.flush();
}
内部控制器:
Object obj;
Token token;
obj = tokenService.getByString(urlToken); // query returning detached object
User user;
if (obj != null) {
token = (Token) obj; // Detached, query is "fetch" overriding lazy init, so token contains its user parent
user = token.getUser(); // simply get the user to which this token belongs
if ((token.getExpiryDate().compareTo(new GregorianCalendar()
.getTime())) == 1) {
userService.activateUser(user); // user gets merged inside and its relevant property is changed and propagated to db successfully
tokenService.deleteToken(token); // this line calls DAO method described in snippet above - it fails to delete the token, but no error or exception - record simply stays in database
model.addAttribute("activationSuccess", "true");
}...
用户实体:
public class User {
public static final String FIND_USER_BY_TOKEN = "findUserByToken";
public static final String FIND_USER_BY_USERNAME = "findUserByUsername";
public static final String FIND_USER_BY_EMAIL = "findUserByEmail";
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval=true)
private List<Token> tokens = new ArrayList(); ...
令牌实体:
@Entity
@Table(name = "token")
@NamedQueries({
@NamedQuery(name=Token.FIND_TOKEN_BY_STRING, query="Select t From Token T where t.tokenString=:string")
})
public class Token {
public static final String FIND_TOKEN_BY_STRING = "findTokenById";
@Id
@GeneratedValue
Long id;
@ManyToOne(optional=true)
private User user; ...
现在,如果我打电话给类似的东西:
User c = b.getUser();
em.remove(c);
在 DAO 代码段中,它删除了我不想要的令牌和用户。只有令牌必须被删除。
基本上我要做的是通过字符串属性检索 Token 以及拥有该令牌的用户父级。然后我从令牌中检索此用户并更改用户的一些属性(更改传播到数据库中)。到目前为止一切顺利。然后我想删除令牌作为最终操作,但不会删除用户。
我在第五个小时,请帮助...我设法将令牌的 setId 设置为空(传播到数据库中),但它只会让我知道令牌不再拥有所有者但仍然存在于数据库中。要删除它,我尝试将 DAO 中的 Token 与 null 合并,这引发了异常。然后我尝试在 User 中将 Tokens 列表值设置为 null (从这个令牌中检索到),它也通过我异常。
我应该如何删除我与其父级一起检索的子令牌实体,但将父级保留在数据库中?
SQL Hibernate 日志显示没有删除查询...通过删除方法后。
谢谢,