私はかなりの調査を行いましたが、何らかの理由で機能しません。「ゾンビ」インスタンスを取得する状況にさえなりません(セッションに存在するがデータベースに存在しないなど-この状況があればいいのに) remove()はデータベースに伝播されないためです。子レコードは引き続きデータベース内に存在します。
2 つのテーブルを考えてみましょう: UserとToken(FK_User_Id)、それぞれ 1 対多の関係
動作しない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 スニペット内では、トークンとユーザーの両方が削除されますが、これは私が望んでいるものではありません。トークンのみを削除する必要があります。
基本的に私がやろうとしているのは、トークンを文字列プロパティで取得し、それに加えてこのトークンを所有するユーザーの親を取得することです。次に、このユーザーをトークンから取得し、ユーザーのいくつかのプロパティを変更します (変更は db に伝達されます)。これまでのところすべて成功しています。次に、最終操作としてトークンを削除したいのですが、ユーザーが削除されないようにします。
私はこれで5時間目です助けてください...トークンのIdをnullに設定することができました(dbに伝播されました)が、トークンに所有者がなくなったがデータベースに残っているポイントしか得られません。それを削除するために、DAO内のトークンをnullとマージしようとしましたが、例外がスローされました。次に、ユーザー(このトークンから取得された)内でトークンリストの値をnullに設定しようとしましたが、それも例外です。
親で取得した子トークンエンティティを削除するが、親をデータベースに保持するにはどうすればよいですか?
SQL Hibernate ログに削除クエリが表示されない...remove メソッドを渡した後
ありがとう、