0

私はかなりの調査を行いましたが、何らかの理由で機能しません。「ゾンビ」インスタンスを取得する状況にさえなりません(セッションに存在するがデータベースに存在しないなど-この状況があればいいのに) remove()はデータベースに伝播されないためです。子レコードは引き続きデータベース内に存在します。

2 つのテーブルを考えてみましょう: UserToken(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 メソッドを渡した後

ありがとう、

4

1 に答える 1