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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследоване и JPA, Заполнение поля в родительской таблице 
:(
    Опции темы
drG100k
Дата 7.11.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! 
Во время изучения наследования в JPA возникла такая задача...
Есть 3 таблицы:
1. Parent (EntryId, Number, Description)
2. Child1(Id(FK),etc...)
3. Child2(Id(FK),etc...)
 Между Parent и Child[s] Связи 1:1

Код

//Parent

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.CHAR, length=1)
@Table(name="Parent")
public abstract class Parent {

@Id
@Column(name="EntryId")
protected Long id;

@Column(name="Number")
protected Integer number;

//etc...
}

//Child1
@Entity
@Table(name="Child1")
@DiscriminatorValue(value="A")
@PrimaryKeyJoinColumn(name="Id")
public class Child1 extends Parent {
//etc...
}

//Child2
@Entity
@Table(name="Child2")
@DiscriminatorValue(value="B")
@PrimaryKeyJoinColumn(name="Id")
public class Child2 extends Parent {
//etc...
}


Так вот... Задача состоит в том чтобы поле "Number" по разному заполнялось в зависимости от типа потомка (к примеру если создаётся запись Child1, то поле Number заполняется из Sequence в Базе данных, а если Child2, то
Код

Child2 a = new Child2();
a.setNumber(1);
(EntityManager)em.persist(a);
 

в  @Column есть свойство Insertable, но как значение этого свойства изменять в зависимости от типа потомка?

Пока это писал придумал ещё одну задачку на ту же тему: Наследование на основе одной таблицы. В ней есть поле (не ключевое), которое должно автоматом заполняться, но из разных Sequence, в зависимости от DiscriminatorValue.

Конечно, тут можно в родительском классе на поле поставить Insertable=false и реализовать логику заполнения через триггер в СУБД... 

1. Есть ли решения такого плана с помощью JPA?
2. Как на не ключевое поле "натравить" @GeneratedValue ?
  


Это сообщение отредактировал(а) drG100k - 7.11.2008, 22:26
PM MAIL   Вверх
powerOn
Дата 7.11.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



а что если в конструкторе Child2 сделать setNumber(1); ?


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
drG100k
Дата 8.11.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(powerOn @ 7.11.2008,  22:46)
а что если в конструкторе Child2 сделать setNumber(1); ?

Так это тоже самое, что я написал: хоть в конструкторе, хоть через setter всё равно придётся использовать механизмы СУБД, а именно триггер before insert. Мне же хочется переложить всё это дело на JPA к примеру 
Код

//Parent   
...
abstract Integer getNumber();
...
//Child1
...
@Column(name="Number", table="Parent")
@GeneratedValue(strategy=SEQUENCE, generator="Child1Generator")
public Integer getNumber(){
return number;
}
...
//Child2
...
@Column(name="Number", table="Parent")
public Integer getNumber(){
return number;
}
...


Но генераторы только на @Id действуют... 
или я где-то что-то недочитал...
PM MAIL   Вверх
powerOn
Дата 8.11.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Применить @GeneratedValue можно только совместно с @Id, т.е. только для генерации primary ключей. 
Как вариаент, можно для каждого подкласса написать callback на persist операцию (@PrePersist), который подставит нужно значение при сохранении объекта в БД. Но я не могу оценить насколько он Вам подходит...


--------------------
user posted image нет времени думать - нужно писать КОД!

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

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

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


 




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


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

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