Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate annotations / 7 сообщений из 7, страница 1 из 1
28.03.2007, 21:21:13
    #34423093
Antony Erofeev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate annotations
Есть проблема...

В hibernate, когда для мэппинга используются его родные xml-конфиги, update Many-To-One ассоциации можно проводить с любой стороны. Т.е. если один класс содержит коллекцию дргих, то мы можем сказать entry.getSomeCollection().add(anotherEntry); и все прекрасно положится в базу. Если же мы пользуемся аннотациями, то по спецификации у нас всегда одна сторона ассоциации должна быть owning, а другая owned. И когда entry на owned side, при entry.getSomeCollection().add(anotherEntry) в базу ничего не ложиться. Самое интересное, что если проставить в аннотацию каскадинг на все, например так: @OneToMany(mappedBy="user", cascade=CascadeType.ALL) то записи в базу упадут, но foreign keys у них будут null.

Собственно вопрос: можно ли при использовании аннотаций добиться первого варианта поведения???
...
Рейтинг: 0 / 0
29.03.2007, 08:39:26
    #34423408
rusBob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate annotations
Доброго времени суток!
А чем собственно говоря не устраивает мэппинг?
Было много дискуссий по поводу аннотаций, и лично я считаю что лучше всего простой мэппинг ;-)...
Можно попробовать сделать это следующим образом. Создать таблица и связать их ключами на уровне СУБД. А потом создать бизнесс объекты на базе этих таблиц используя например Оракловый TopLink (ejb3 ), NetBeans позволяет такое сделать... и посмотреть сами классы, по идеи аннотации должны все связи отследить....

Я болею за СКА РОСТОВ!!!
Трепещи Москва, мы уже в первой лиге ;-)
...
Рейтинг: 0 / 0
29.03.2007, 10:32:45
    #34423672
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate annotations
выглядит ооочень странно. по идее между xml и аннотациями разницы ну никакой. Делал нормальный проект на аннотациях - однако работало всё. по подробней отпишите
...
Рейтинг: 0 / 0
29.03.2007, 11:41:39
    #34424004
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate annotations
У вас начальная посылка ложна (см http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html#tutorial-associations-usingbidir)

т.е. во-первый hibernate сам не занимается установкой ссылок в обоих концах bi-directional ассоциаций , во-вторых то что в EJB3 называется owning и owned концами раньше обрабатывалось с помощью inverse атрибута
...
Рейтинг: 0 / 0
29.03.2007, 11:56:49
    #34424086
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate annotations
funikovyuri +1
rusBob xml-маппинг имхо моветон уж лет как сто. из-за него люди начинают с xdocletнёй пучкаться - эт ваще жуть. разработка от DB тоже имхо жуткая тема. ибо собирать базу похреновее чем классы писать или umlить. Ну и к тому же я не могу припомнить на жабе дизайнер баз как в MSSQLе. поэтому аннотированные поджи имхо рулят
...
Рейтинг: 0 / 0
29.03.2007, 13:41:49
    #34424574
Antony Erofeev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate annotations
Попробую описать проблему поподробнее, на тестовом примере.

Есть два класса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
@Entity()
@Table(name="USERS")
 public   class  User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
     private   Long  id;
    
    @Column(name="USER_NAME")
     private  String name;
    
    @OneToMany(mappedBy="user", cascade=CascadeType.ALL)
     private  Set<Resource> resources;
......

@Entity()
@Table(name="RESOURCES")
 public   class  Resource  implements  Serializable {
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
     private   Long  id;
    
    @Column(name="RESOURCE_NAME")
     private  String name;
    
    @ManyToOne
     private  User user;
.......

После выполнения данного кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
......
User u =  new  User();
u.setName("Kolumb");
        
Resource res =  new  Resource();
res.setName("Big gun");
        
Resource res1 =  new  Resource();
res1.setName("Bullets");
        
u.setResources( new  HashSet<Resource>());
u.getResources().add(res);
u.getResources().add(res1);
        
em.persist(u);
trans.commit();
.........

Мы получаем в базе следующее:
Users
ID | USER_NAME
----------------------
1 | Kolumb

Resources
ID | RESOURCE_NAME | USER_ID
----------------------------------------
2 | Big gun | null
----------------------------------------
3 | Bullets | null

Если же работать не с аннотациями, а с родным хибернейтовским мэппингом, выглядящим так:
Для User:
<hibernate-mapping package="hibtest">
<class name="User" table="users">
<id name="id" column="id" type="long">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string"></property>
<set name="resources" table="resources" cascade="all,delete">
<key column="user_id"/>
<one-to-many class="Resource"/>
</set>
</class>
</hibernate-mapping>

Для Resource:
<hibernate-mapping package="hibtest">
<class name="Resource" table="resources">
<id name="id" column="id" type="long">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string"></property>
<many-to-one name="user" class="User" column="user_id"/>
</class>
</hibernate-mapping>

Тогда после ровно того-же кода, для работы с сущностями (ну за исключением того, что используется естественно не EntityManager, А родная Session), табличка Resources выглядит так:

Resources
ID | RESOURCE_NAME | USER_ID
----------------------------------------
2 | Big gun | 1
----------------------------------------
3 | Bullets | 1
...
Рейтинг: 0 / 0
29.03.2007, 13:52:04
    #34424616
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate annotations
в мануалах написано однозначно: программер обязан поддерживать обе стороны ассоциации.
я осмелюсь сомневаться в чистоте эксперимента с xml-mapping ом.

ну и вот это
Код: plaintext
u.setResources( new  HashSet<Resource>());
совсем некошерный почин
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate annotations / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]