2014-01-25 3 views
0

Я новичок в JPA и задаю вопрос относительно именования.JPA, отношения между сущностью, таблицей и классом

У меня недавно возникли проблемы, когда я получил ошибки, говорящие что-то вроде этого там, где два объекта с тем же именем в моей системе персистентности. (Я был глупым и не сохранял сообщение об ошибке)

Я делаю веб-приложение (Java EE 7, Glassfish), которое подключается к удаленному db с использованием API (UniProt JAPI). Классы API, похоже, содержат объект под названием «Protein». Дело в том, что у меня есть локальный db, который я хотел написать для некоторых классов сущностей, один из которых назывался «Protein», потому что таблица в моем локальном db называлась «белок». Это, казалось, вызывало конфликты имен с внешним производным «Protein». Самый простой способ это я решил переименовать в местный протеин.

Но я не уверен, как это сделать.

Мое предположение было делать что-то вроде этого:

@Entity(name="MyProtein") 
@Table(name="protein") 
public Class MyProtein { 

Потому что священник научил имя = «MyProtein» в @Entity аннотацию установит имя объекта. Так ли это и должно ли оно быть таким же, как имя класса?

И имя = "белок" в аннотации @Table Я вычислил набор из таблицы для отображения объекта. Является ли это так, и означает ли это, что объект может отображать только одну таблицу в базе данных? Является ли аннотирование таблицы каким-либо отношением к имени класса?

ответ

0

@Entity в порядке. Вам не нужно использовать name.

Используя объект @Table, вы сопоставляете таблицу своим сущностью через значение name.

Для проекта JPA у вас может быть один объект, который должен указывать только одну таблицу. И логически несколько объектов могут указывать на одну таблицу (я никогда не использовал такие вещи).

0

В данном примере атрибут имени @Entity не имеет значения. Имя по умолчанию имеет неквалифицированное имя класса сущности, которое в этом случае одинаково. Этот атрибут удобен, когда есть два объектные классы с одинаковыми именами в разных пакетах:

package a; 

@Entity 
public class MyProtein { ... } 


package b; 
//for this one we override default name (MyProtein) 
@Entity (name = "SomethingElse") 
public class MyProtein { ... } 

Это было необходимо, чтобы переименовать второй объект, потому что мы не можем иметь несколько объектов с одинаковым именем.

Имя таблицы по умолчанию совпадает с именем объекта.

  • Название объекта для a.MyProtein является MyProtein (по умолчанию), так это имя таблицы базы данных.
  • Entity имя b.MyProtein является SomethingElse, так это имя таблицы базы данных

Когда это необходимо, чтобы иметь другое имя таблицы, чем умолчанию, @Table могут быть использованы. Документация API объясняет атрибуты и их значения по умолчанию.

Стойкие атрибуты объекта можно разделить на несколько таблиц, но каждый объект имеет только одну основную таблицу, а один атрибут хранится только в одной таблице. Вторичная таблица указана в @SecondaryTable. Когда их много, тогда появляется картинка @SecondaryTables. Если атрибут должен быть сохранен второй таблице, имя таблицы приведен в name атрибут @Column

Может быть, это происходит более ясно, с помощью, например:

//overrides default MyProtein 
@Entity(name="SomeEntity") 
//overrides default SomeEntity (default is entity name, not the name of class) 
@Table(name="protein") 
@SecondaryTables({ 
    @SecondaryTable(name="more_protein_attributes"), 
    @SecondaryTable(name="and_even_more") 
}) 
public class MyProtein { 
    @Id private Integer id; 
    //attribute to be stored to to 'protein' table 
    private String attr1; 

    @Column(table = "more_protein_attributes") 
    private String attr2; 

    @Column(table = "and_even_more") 
    private String attr3; 

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