2012-05-30 3 views
0

Я определен набор таблиц t1, t2, ... Tn:JPA: определение сложных отношений @OneToMany

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 |    | 
(....) 
+---------------+------------------+------+-----+---------+----------------+ 

Теперь, как я должен определить @Entity для таблицы 't1' ....

@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 аннотации, чтобы определить это соотношение, или я должен вводить (как?) В EntityManager в каждом отдельном случае от T1 и вызвать @NamedQuery?

ответ

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; 
} 
+0

ОК, насколько я понимаю, мне нужно создать «N'-классы для моих« N'-таблиц ». Спасибо. – Pierre

2

Думаю, вам следует моделировать таблицы, используя inheritance.

Так что у вас есть 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 лица к таблицам. Я думаю, что somothing как

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

должно работать.

Более подробную информацию можно найти здесь http://wleeper.com/2009/12/17/jpa-onetomany-with-inheritance/

Смежные вопросы