Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Таблица на несколько сущностей в ejb3


Автор: coolin 16.4.2007, 07:55
пример 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 класса.

Автор: polosatij 16.4.2007, 13:29

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

Код

...
    @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 

Автор: coolin 17.4.2007, 06:16
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;
}
       ...
}


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

Код

<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>

Автор: coolin 17.4.2007, 09:31
может быть что-то похожее на это:

@AttributeOverride(name = "Name1.Initial.gr1", column = @Column(name = "Name1_Initial_gr1"))

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


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

Автор: coolin 18.4.2007, 07:47
Код



@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, если их нельзя в одном классе несколько раз замапить...
Может версию стоит обновить..?

Автор: coolin 20.4.2007, 08:04
помогло переопределение DefaultComponentSafeNamingStrategy - кода меньше

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)