2015-12-14 4 views
4

Я интересно, если есть возможность выборки нескольких таблиц только одного класса Java для Exemple:Hibernate один класс многих таблиц

TABLE LABELS; 
TABLE STANDARDS; 
TABLE REFERENCES; 

отображенной к тому же классу

public Class Information { 

    private String type; // the type is the element who have to do the mapping => LABELS/STANDARDS/REFERENCES 
    ... 
} 

Это мне не удалось построить один класс для каждого типа по техническим причинам (я знал, что какое-то наследие должно быть круто).

Спасибо

Жиль

EDIT:

Постараюсь expain немного больше :)

Я использую сервис JMS, чтобы получить информацию. Каждое сообщение имеет особый тип (в моих примерах: «метки», «стандарты» и «ссылки»).

Используя этот тип, я хочу сохранить информацию в соответствующих таблицах. Структура одинакова для всех сообщений, поэтому я хочу использовать уникальную POJO.

Я надеюсь, что это было лучше объяснить :)

EDIT 2:

TABLE LABELS (
    ID PRIMARY KEY AUTO_INCREMENT, 
    MESSAGE VARCHAR(255), 
    AUTHOR VARCHAR(255) 
); 
TABLE STANDARDS(
    ID PRIMARY KEY AUTO_INCREMENT, 
    MESSAGE VARCHAR(255), 
    AUTHOR VARCHAR(255) 
); 
TABLE REFERENCES (
    ID PRIMARY KEY AUTO_INCREMENT, 
    MESSAGE VARCHAR(255), 
    AUTHOR VARCHAR(255) 
); 

и вот некоторые примеры JMS

headers : 
    type : label 
body: 
    {message:"name of the country",author:"john doe"} 

headers : 
    type : label 
body: 
    {message:"nom du pays",author:"jenny doe"} 

headers : 
    type : reference 
body: 
    {message:"country",author:"john doe"} 

, и я хочу, чтобы поместить их в информационный класс и сохраняйте их в правильной таблице

+0

Я знаю, проблема в том, что я использую отражение в моем коде, чтобы увидеть от того, что тип информации, которая поступает от службы JMS –

+0

@ PeterRader Done;) Я отредактировал мой пост –

ответ

1

Попробуйте это:

@MappedSuperclass 
public class Base { 
    private String message; 
    private String autor; 
    @Column(name = "MESSAGE") 
    public String getMessage(){ 
    return message; 
    } 
    public void setMessage(final String message) { 
    this.message = message; 
    } 
    @Column(name = "AUTOR") 
    public String getAutor(){ 
    return autor; 
    } 
    public void setAutor(final String autor) { 
    this.autor = autor; 
    } 
} 

И три класса:

@Entity 
@Table(name="LABELS") 
public class Labels extends Base{}; 

И

@Entity 
@Table(name="STANDARDS") 
public class Standards extends Base{}; 

И

@Entity 
@Table(name="REFERENCES") 
public class References extends Base{}; 

Теперь вы можете сохраняться данные с помощью:

Base b; 
if (info.getType().equals("REFERENCES")) { 
    b=new References(); 
} else if (info.getType().equals("LABELS")) { 
    b=new Labels(); 
} else if (info.getType().equals("STANDARDS")) { 
    b=new Standards(); 
} else { 
    return; 
} 
b.setMessage(info.getMessage()); 
b.setAutor(info.getAutor()); 
Transaction t = session.beginTransaction(); 
session.persist(b); 
t.commit(); 
+0

Я пытался сделать это сейчас, я возвращаюсь к вам, если это работает :) Я должен отказаться от идеи чтобы иметь прекрасный уникальный POJO: '( –

+0

Возможно, это правильное решение, но обратите внимание, что класс Base должен быть аннотирован аннотацией @MappedSuperclass. –

+0

@AlanHay В чем разница, если класс не был аннотирован этим MappedSuperclass? –

0

Вы можете использовать secondaryTables:

http://docs.oracle.com/javaee/6/api/javax/persistence/SecondaryTables.html

+0

Я пробовал прямо –

+0

Разве это не JPA, а не Hibernate? Для меня обязательным является использование Hibernat. У меня нет выбора ...:/ –

+0

Вторичные таблицы для некоторой части информации класса, отображаемого в нескольких таблицах. В моем случае весь класс должен быть сопоставлен:/ –

0

Вы можете спросить, если вы можете сделать table per subclass отображение. У вас может быть один класс для каждой таблицы, но все наследуются от общего базового класса.

Альтернативно, если вы создаете сопоставление только для чтения, вы можете сделать вид, который является UNION по всем соответствующим таблицам, и просто отобразить представление с помощью Hibernate.Что-то вроде

-- SQL 
CREATE VIEW information AS 
    SELECT 'LABEL' AS type,... FROM labels 
    UNION 
    SELECT 'STANDARD',... FROM standards 
    UNION 
    SELECT 'REFERENCE',... FROM references 
    ; 

/* Java */ 
@Entity 
@Table(name="information") 
public class Information { 
    ... 
} 
+0

Проблема в том, что я хотел бы иметь отображение чтения/записи: /, но это была хорошая идея (я отмечаю это на будущее) :) thx –

+0

И, к сожалению, я не администратор базы данных, поэтому у меня нет DDL-привилегии :( –

+0

Здесь нет наследования на уровне базы данных, поэтому иерархия наследования JPA не является допустимым решением. –

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