0

OneToMany 関係があります。レコードを挿入できますが、削除できません。削除しようとすると、「外部キー制約が失敗しました」というエラーが発生します。次のようにカスケード削除オーファンを使用しましたが、まだ機能しません。

親クラスには、そのメンバーに対して次のゲッターがあります

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;

@Entity
@DynamicUpdate
public class User extends Employee{
    private string userli;
    privae List<Message> messagelist();

    .....

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    public List<Message> getMessagelist() {
        return messagelist;
    }

メンバー クラスには、親に対して次の getter があります

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
 ......  

   @ManyToOne
   public User getReciever() {
        return reciever;
   }

次の注釈も使用しましたが、機能しませんでした

     @Cascade(org.hibernate.annotations.CascadeType.DELETE)

私の休止状態の依存関係は次のとおりです

 <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.2.1.Final</version>
    <type>jar</type>
</dependency>

メッセージを削除する私のコード

            Message message = (Message) session.get(Message.class, id);
            session.delete(message);
            tx.commit();
4

3 に答える 3

1

OneToMany 関係を操作するには、いくつかの方法があります。最も一般的な方法の 1 つは次のようになります。

@OneToMany(mappedBy="receiver", CascadeType.REMOVE)
public List<Message> getMessagelist() {
        return messagelist;
}

....

@ManyToOne
public User getReciever() {
        return reciever;
}

fetch = FetchType.LAZY はデフォルトであり、実際に指定する必要はないことに注意してください。

さらに、db 制約が既に作成されているため、テーブルを再作成する必要がある場合があります。この場合、hbm2ddl.auto=update を 100% 信頼しないでください。関連するテーブル (Message、Reciver、Receiver_Message または Message_Receiver) を削除することをお勧めします。次に、hbm2ddl.auto=update を使用できます。

お役に立てば幸いです。

乾杯

于 2013-07-31T03:46:33.540 に答える
0

次の注釈を追加してみてください。それは私のために働いた。

@OneToMany(mappedBy="receiver", cascade=CascadeType.ALL, fetch=FetchType.LAZY)  
@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
 public Set<Message> getMessagelist() {
    return messagelist;
}

私はエンティティマネージャーの削除方法を使用していますが、それは私にとってはうまくいきます。私の意見では、リストの代わりにセットを使用しています。これは効率的な方法です。

孤立した注釈の削除は、「MessageList からエンティティを削除して User をマージしようとすると、メッセージを安全に削除できる」ことを hibernate に伝えるためだけのものです。

@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
于 2014-07-17T06:37:59.827 に答える