4

次のように、多対多の関係を持つ2つのエンティティCRImageTypeとCRVariableがあります。

CRImageType エンティティ:

@Entity
@Table(name = "imageviewer_crimagetype")
public class CRImageType implements Serializable   {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "ImTypeId")
    private Long imTypeId;

    @Column(name = "ImTypeName")
    private String imTypeName;

    @Column(name = "ImTypeDescription")
    private String imTypeDescription;

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name="imageviewer_imtype_variable", 
    joinColumns={@JoinColumn(name="ImTypeId")}, 
    inverseJoinColumns={@JoinColumn(name="VarId")})
    private Set<CRVariable> crvariables = new HashSet<CRVariable>();

CRVariable エンティティ:

@Entity
@Table(name = "imageviewer_crvariable")
public class CRVariable implements Serializable   {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "VarId")
    private Long varId;

    @Column(name = "VarName")
    private String varName;

    @Column(name = "VarDescription")
    private String varDescription;

    @ManyToMany(mappedBy="crvariables")
    private Set<CRImageType> crimagetypes = new HashSet<CRImageType>();

私のデータベースでは、関係は「imageviewer_crimagetype」と「imageviewer_crvariable」の2つのテーブルと、多対多の関係の「imageviewer_imtype_variable」の3番目のテーブルによってマッピングされます。

テーブル"imageviewer_imtype_variable"から関連付けレコードを削除したいだけです。「imageviewer_imtype_variable」テーブルに直接アクセスできないため、HQL クエリを使用してどのように実行できますか。

次のようなSQLクエリに相当するHQLが欲しい

delete from imageviewer_imtype_variable where ImTypeId='%%%'
4

5 に答える 5

3

これはJPAであり、特にHibernateではありません。ここに標準化された API があるという事実により、実装ではなく API のコンテキストで検索すると、答えを見つけやすくなります。

それを行う方法 (私が覚えている限りでは、多対多の関係を頻繁に使用することはありません) は、関連するエンティティを互いのコレクション マッピング フィールドから削除することです。したがって、EntityA と EntityB がある場合は、EntityA を EntityB から削除し、EntityB を EntityA から削除します。その後、持続性プロバイダーをトリガーして、結合テーブルからレコードを削除する必要があります。

ネイティブ クエリは、IMO の最後の手段にすぎません。

于 2012-11-08T16:17:56.787 に答える
1

私の経験からすると、ManyToMany 関係を処理することは、ORM 統合主義から抜け出すことが私たちの心のために最善の選択肢である数少ないケースの 1 つです。特に、双方向ナビゲーションを使用する場合 (つまり、関係と逆関係が役立つ場合)。

@Gimbyは彼の答えで正しいです。複雑な相互参照では、単純なネイティブクエリを実行するよりも、それを機能させるのがはるかに難しいということです。

そう:

session.createSQLQuery("DELETE FROM imageviewer_imtype_variable").executeUpdate();

相互参照のためにそれでも機能しない場合は、次のように追加することもできます。

session.clear();

わかった。これは ORM 統合主義のもう 1 つの違反ですが、2 行で泥沼から抜け出すことができます ;-) .

于 2014-12-02T11:05:00.303 に答える
1
  • ネイティブ SQL クエリを実行できます。

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch18.html#querysql-creating

したがって、あなたの場合、次のようなものです:

session.createSQLQuery("DELETE FROM imageviewer_imtype_variable").executeUpdate();
  • CrImageTypeエンティティ内でカスタム ネイティブ SQL DELETE クエリを指定することもできます。

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch18.html#querysql-cud

于 2012-11-08T15:53:50.993 に答える
0

@Gimby からの回答は正しいものです。多対多の関係では、関連するインスタンスを相互のマッピング コレクションから削除すると、関係マッピング テーブルからの削除がトリガーされます。

于 2012-11-08T16:53:14.160 に答える