0

テーブルのセットt1、t2、... tNを定義しました:

mysql>  desc t1;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
(...)
+-------------+------------------+------+-----+---------+----------------+

(...)

mysql>  desc tN;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
(...)
+-------------+------------------+------+-----+---------+----------------+

テーブルt1、... tNの各レコードに関するコメントを格納するテーブル:

 mysql> desc postit;

+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| id            | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| foreign_id    | int(10) unsigned | NO   | MUL | NULL    |                |
| foreign_table | varchar(20)      | NO   | MUL | NULL    |                |
| content       | text             | NO   |     | NULL    |                |
(....)
+---------------+------------------+------+-----+---------+----------------+

次に、テーブル't1'の@Entityをどのように定義する必要がありますか...。

@Entity(name="T1")
@Table(name="t1")
public class T1
    {
        (...)
        public List<PostIt> getComments() { ... }
        }

式が次のようになっているため、テーブル'postit'からすべてのコメントを取得します。

select P from postit as P where P.foreign_table="t1" and P.foreign_id= :t1_id

この関係を定義するための特定のJPAアノテーションはありますか、それともT1の各インスタンスにEntityManagerを注入して@NamedQueryを呼び出す必要がありますか?

4

2 に答える 2

2

継承を使用してテーブルをモデル化する必要があると思います。

あなたがAbstractTableを持っているように

@Entity
@DiscriminatorColumn(name="type_id")
@DiscriminatorValue("-1")
...
class AbstractTable {

@OneToMany(mappedBy="foreign_id")
public List<PostIt> getComments() { ... }
        }
...
}

また:

@Entity
@DiscriminatorValue("1")
...
class Table1 {}

@Entity
@DiscriminatorValue("2")
...
class Table2 {}

双方向の関係が必要な場合は、Postit エンティティからテーブルを参照する方法を理解する必要があります。私は何かのように思う

@ManyToOne
public AbstractTable getTable() { ... }

動作するはずです。

詳細については、http://wleeper.com/2009/12/17/jpa-onetomany-with-inheritance/をご覧ください。

于 2012-05-30T11:47:13.007 に答える
1

この設計は継承ツリーに対応しており、ルートの AbstractComment エンティティのすべてのサブクラスが識別子列 ( foreign_table)を使用して同じテーブルに格納されます。

@Entity
@Table(name = "postit")
@Inheritance(strategy = SINGLE_TABLE)
@DiscriminatorColumn(name = "foreign_table", discriminatorType = STRING)
public abstract class AbstractComment {
    // ... fields, getters, setters
}

@Entity
@DiscriminatorValue("t1")
public class T1Comment extends AbstractComment {

}

@Entity
@Table(name="t1")
public class T1 {
    @OneToMany
    @JoinColumn(name = "foreign_id")
    private Set<T1Comment> comments;
}
于 2012-05-30T11:48:53.120 に答える