Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таблица на несколько сущностей в ejb3, перенос маппинга из hibernate в ejb3 
:(
    Опции темы
coolin
Дата 16.4.2007, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



пример hibernate-маппинга, когда класс Person содержит подкласс Name, столбцы которого расположены в той же таблице person

<class name="eg.Person" table="person">
    <id name="Key" column="pid" type="string">
        <generator class="uuid"/>
    </id>
    <property name="birthday" type="date"/>
    <component name="Name" class="eg.Name"> <!-- class attribute optional -->
        <property name="initial"/>
        <property name="first"/>
        <property name="last"/>
    </component>
</class>


Как это сделать в ejb3? Тоесть хочеться иметь также 2 класса.
PM MAIL   Вверх
polosatij
Дата 16.4.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 3
Всего: 8




делаешь два класса.. первый содежит:

Код

...
    @OneToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="NAME_ID", nullable=false) // если nullable= false
    public Name getName() {
        return this.userInfo;
    }
    
    public void setName(Name name) {
        this.name = name;
    }
...


второй:

Код

...
@Entity
@Table(name="Name")
public class Name implements Serializable {
    private static final long serialVersionUID = 2L;
    
    private int id;
    private String initial;  // <- так?
    private String first; //
    private String last;

// и дальше пустой конструктор и get-теры и set-теры к переменным..


усё  smile 


--------------------
PM   Вверх
coolin
Дата 17.4.2007, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



polosatij, таблица одна и она не
@Table(name="Name") а person


на самом деле нужно днлать так

Код

@Embeddable public class Name implements java.io.Serializable { 
   private String initial; 
   private String first; 
   private String last; 
....................
}


Код

@Entity 
public class Person implements java.io.Serializable { 

private Name  name;

       ...
@Embedded 
public Name getName(){
           return name;
}
       ...
}


PM MAIL   Вверх
coolin
Дата 17.4.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



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

Код

<class name="eg.Person" table="person">
  <id name="Key" column="pid" type="string">
    <generator class="uuid"/>
  </id>
<property name="birthday" type="date"/>
<component name="Name1" class="eg.Name"> 
  <property name="initial" column="Name1_initial"/>
  <property name="first" column="Name1_first"/>
  <property name="last" column="Name1_last"/>
</component>
<component name="Name2" class="eg.Name"> 
  <property name="initial" column="Name2_initial"/>
  <property name="first" column="Name2_first"/>
  <property name="last" column="Name2_last"/>
</component>
</class>


такое решаеться так:

Код

@Embeddable public class Name implements java.io.Serializable { 
   private String initial; 
   private String first; 
   private String last; 
....................
}


@Entity 
public class Person implements java.io.Serializable { 

private Name  name1;
private Name  name2;

       ...
@Embedded 
@AttributeOverrides({
    @AttributeOverride(name = "initial", column = @Column(name = "name1_initial")),
    @AttributeOverride(name = "first", column = @Column(name = "name1_first")),
    @AttributeOverride(name = "last", column = @Column(name = "name1_last"))
        })    
public Name getName1(){
           return name1;
}

@Embedded 
@AttributeOverrides({
    @AttributeOverride(name = "initial", column = @Column(name = "name2_initial")),
    @AttributeOverride(name = "first", column = @Column(name = "name2_first")),
    @AttributeOverride(name = "last", column = @Column(name = "name2_last"))
        })    
public Name getName2(){
           return name2;
}

       ...
}


но что если вложенность большая (initial - тоже сложный объект), как например перегрузить типо такого name2_initial_gr1, можно вообще перегружать все поля внезависимости от их вложенности?

пример:
Код

<class name="eg.Person" table="person">
  <id name="Key" column="pid" type="string">
    <generator class="uuid"/>
  </id>
<property name="birthday" type="date"/>
<component name="Name1" class="eg.Name"> 
  <component name="initial" class="eg.Initial"/>
    <property name="gr1" column="Name1_Initial_gr1"/>
    <property name="gr2" column="Name1_Initial_gr2"/>
  </component>
  <property name="first" column="Name1_first"/>
  <property name="last" column="Name1_last"/>
</component>
<component name="initial" class="eg.Initial"/>
  <property name="gr1" column="Initial_gr1"/>
  <property name="gr2" column="Initial_gr2"/>
</component>
</class>

PM MAIL   Вверх
coolin
Дата 17.4.2007, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



может быть что-то похожее на это:

@AttributeOverride(name = "Name1.Initial.gr1", column = @Column(name = "Name1_Initial_gr1"))
PM MAIL   Вверх
polosatij
Дата 17.4.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 3
Всего: 8



Цитата(coolin @  17.4.2007,  06:16 Найти цитируемый пост)
polosatij, таблица одна и она не
@Table(name="Name") а person


я предлогал тебе сделать отдельную таблицу для твоих нужд и 2 класса, а не один класс (!)  smile и я не знал, что таблица должна быть вложенная, сорри.. 


Это сообщение отредактировал(а) polosatij - 17.4.2007, 16:25


--------------------
PM   Вверх
coolin
  Дата 18.4.2007, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



Код



@Entity 
public class Person implements java.io.Serializable { 

private Name  name1;
private Name  name2;

       ...
@Embedded 
@AttributeOverrides({
    @AttributeOverride(name = "initial", column = @Column(name = "name1_initial")),
    @AttributeOverride(name = "first", column = @Column(name = "name1_first")),
    @AttributeOverride(name = "last", column = @Column(name = "name1_last"))
        })    
public Name getName1(){
           return name1;
}

@Embedded 
@AttributeOverrides({
    @AttributeOverride(name = "initial", column = @Column(name = "name2_initial")),
    @AttributeOverride(name = "first", column = @Column(name = "name2_first")),
    @AttributeOverride(name = "last", column = @Column(name = "name2_last"))
        })    
public Name getName2(){
           return name2;
}

       ...
}


таккой код тупо дает ошибку повторения колонок: smile 


org.hibernate.MappingException: Repeated column in mapping for entity: Person column: initial (should be mapped with insert="false" update="false")


я так полагаю это реальный недочет, зачем нужны Embeddable, если их нельзя в одном классе несколько раз замапить...
Может версию стоит обновить..?
PM MAIL   Вверх
coolin
Дата 20.4.2007, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 4.9.2006

Репутация: нет
Всего: нет



помогло переопределение DefaultComponentSafeNamingStrategy - кода меньше
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0796 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.