Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / jpa 2.1 связь 3х справочников / 19 сообщений из 19, страница 1 из 1
16.08.2013, 04:17:23
    #38368361
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
jpa 2.1 eclipselink, есть 3 справочника,
item, author, author_role, авторы могут быть в разных итемах под разными ролями,
например автор петров в итеме1 имеет роль 1, и он же в итеме2 роль2 и тд..

что получилось

Код: java
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
@Entity
@Table(name = "items")
public class Item extends AbstractModel implements Serializable {
  @Setter private List<Author> authorList;

  @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH})
  @JoinTable(name = "items_authors",
          joinColumns = @JoinColumn(name = "item_id"),
          inverseJoinColumns = @JoinColumn(name = "author_id"))
  public List<Author> getAuthorList()    { return authorList; }
}

@Entity
@Table(name = "authors")
@NamedQueries({
        @NamedQuery(name = "getAuthorList", query = "SELECT a FROM Author a WHERE 1=1 ORDER BY a.updateTime desc")
})
public class Author extends AbstractModel implements Serializable {
  @Setter private AuthorRole authorRole;
  @Setter private List<Item> itemList;

  @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH})
  @JoinColumn(name = "author_role_id")
  public AuthorRole getAuthorRole()                       { return authorRole; }

  @ManyToMany(fetch = FetchType.LAZY, mappedBy = "authorList")
  public List<Item> getItemList()                           { return itemList; }
}

@Entity
@Table(name = "author_roles")
@NamedQueries({
        @NamedQuery(name = "getAuthorRoleList", query = "SELECT a FROM AuthorRole a WHERE 1 = 1 ORDER BY a.updateTime desc")
})
public class AuthorRole extends AbstractModel implements Serializable {
  @Setter private List<Author> authorList;

  @OneToMany(mappedBy = "authorRole", cascade = {CascadeType.DETACH})
  public List<Author> getAuthorList()                { return authorList; }
}



не очень вроде, роли будут дублироваться,
думал вариант с @ElementCollection

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Entity
@Table(name = "items")
public class Item extends AbstractModel implements Serializable {
  @Setter private Map<Author, AuthorRole> authorRoles;

 @ElementCollection 
 @CollectionTable(name="items_authors_roles")
 @MapKeyJoinColumn(name="author_id")
 @Column(name="author_role")  
 public Map<Author, AuthorRole> getAuthorRoles()    { return authorRoles; }
}



не получиться одного автора под несколькими ролями, так как он key, ну и наоборот..
и AuthorRole не связан

как правильней тут ?
спасибо
...
Рейтинг: 0 / 0
16.08.2013, 08:49:56
    #38368432
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breath,
если у тебя много ко многим, так и найди тут рабочий пример поиском
...
Рейтинг: 0 / 0
16.08.2013, 09:39:54
    #38368459
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
Вместо @ElementCollection следует объявить композит с множеством Set<AuthorRole> внутри, но можно ли это сделать с помощью JPA аннотаций - не знаю.
Композиты поддерживаются в хибернейте (я делал на hiberbnate мэппинге), и вроде в eclipselink начиная с 2.3 что-то есть тоже
...
Рейтинг: 0 / 0
16.08.2013, 16:58:19
    #38369195
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
чото не понял,

роль автора должна иметь значение через связь с итемом, типа
Код: java
1.
ItemDB.findById(1).getAuthorList().get(1).getAuthorRole();



Petro123
многие ко многим с чем ?

ivanra
композиты это Compound Primary Keys ? они есть

Код: java
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
public class ItemId implements Serializable {
 private Set<AuthorRole> ar;
 private Integer id;

  @Override
  public boolean equals(Object obj) {
    return this == obj || obj != null && getClass() == obj.getClass();
  }

  @Override
  public int hashCode() {
    return new HashCodeBuilder(17, 31).append(id).append(ar).toHashCode();
  }

}


@Entity
@IdClass(ItemId.class)
@Table(name = "items")
public class Item extends AbstractModel implements Serializable {
  private List<Author> authorList;
  private Set<AuthorRole> aSet;

  @Override
  @SequenceGenerator(name = "isg", sequenceName = "item_sequence", initialValue = 1, allocationSize = 2)
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "isg")
  public Integer getId()                 { return super.getId(); }

  @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH})
  @JoinTable(name = "items_authors",
          joinColumns = @JoinColumn(name = "item_id"),
          inverseJoinColumns = @JoinColumn(name = "author_id"))
  public List<Author> getAuthorList()    { return authorList; }

  @Id
  public Set<AuthorRole> getAuthorRoles()    { return arSet; }
}



только не ясно что получается
...
Рейтинг: 0 / 0
16.08.2013, 17:30:13
    #38369242
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breathPetro123
многие ко многим с чем ?
весь маппинг делится на виды отношений. 1 к М М к 1 и М к М
Надо начать с него.
...
Рейтинг: 0 / 0
16.08.2013, 17:34:25
    #38369248
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
Petro123breathPetro123
многие ко многим с чем ?
весь маппинг делится на виды отношений. 1 к М М к 1 и М к М
Надо начать с него.

ну вопрос c чем в конкретной задаче, а не что есть в природе
...
Рейтинг: 0 / 0
16.08.2013, 17:39:44
    #38369260
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breathну вопрос c чем в конкретной задаче, а не что есть в природе
ни какие у тебя отношения?
Причём тут код?
...
Рейтинг: 0 / 0
16.08.2013, 17:41:01
    #38369264
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
я вроде пояснил задачу и какие должны быть отношения
...
Рейтинг: 0 / 0
16.08.2013, 17:44:23
    #38369274
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breathя вроде пояснил задачу и какие должны быть отношения
хде? Хде слово "Много ко...."?
...
Рейтинг: 0 / 0
16.08.2013, 17:48:04
    #38369282
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
Petro123breathя вроде пояснил задачу и какие должны быть отношения
хде? Хде слово "Много ко...."?

14716217
...
Рейтинг: 0 / 0
16.08.2013, 18:00:06
    #38369305
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breath,

я лично итог твоих мучений в БД не понял:

author
=========
1 Петров
2 Сидоров


item
======

author_role
============
3 Админ
55 Секретарь
...
Рейтинг: 0 / 0
16.08.2013, 18:05:54
    #38369320
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
Petro123breath,

я лично итог твоих мучений в БД не понял:

author
=========
1 Петров
2 Сидоров


item
======

author_role
============
3 Админ
55 Секретарь

Petro123breath,

я лично итог твоих мучений в БД не понял:

author
=========
1 Петров
2 Сидоров


item
======

author_role
============
3 Админ
55 Секретарь

ну круто, а что это ?

если без orm, добавить внешний ключ на роли в связующую таблицу items_authors_roles и все, как с orm хз
...
Рейтинг: 0 / 0
16.08.2013, 18:11:27
    #38369323
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breath,
короче. Моя твоя не понимает.
"Есть 3 справочника", я их не увидел))
Удачи!
...
Рейтинг: 0 / 0
16.08.2013, 18:22:16
    #38369335
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
вот 3 справочника
items, authors, author_roles
авторы могут быть в разных итемах под разными ролями
например, автор петров в итеме1 имеет роль1, и он же в итеме2 - роль2, а в итеме3 снова роль1 и тд..
просто делать связь много ко многим авторы и роли не прокатит, тогда не вытащить сразу вот это
Код: java
1.
ItemDB.findById(1).getAuthorList().get(1).getAuthorRole();


то есть, роль автора должна иметь значение через связь с итемом
...
Рейтинг: 0 / 0
16.08.2013, 18:32:45
    #38369346
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breath,
заполни как я выше таблички примерами по 2-3 записи
...
Рейтинг: 0 / 0
16.08.2013, 18:34:03
    #38369350
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breath,
если не представляешь как они там должны выглядеть, тогда проблема.
...
Рейтинг: 0 / 0
16.08.2013, 18:45:15
    #38369361
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
а есть по теме что конктретно ответить ?
сорри но в пустую писать надоело,
как это без orm отлично представляю,
делается промежучная таблица в которой три поля author_id, role_id, item_id,
вопрос как это описать на orm
...
Рейтинг: 0 / 0
16.08.2013, 21:39:21
    #38369481
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
breath,
ну, тебе лень. А мне тем более).
Выходные...)
Удачи!
...
Рейтинг: 0 / 0
28.08.2013, 19:06:06
    #38380291
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jpa 2.1 связь 3х справочников
продолжение ) получилось так;

ItemAuthorRole - промежуточная таблица

Код: java
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
@Entity
@Table(name = "item_author_role")
public class ItemAuthorRole implements Serializable {
  @Getter @Setter @EmbeddedId
  /*@AttributeOverrides({
          @AttributeOverride(name = "itemId", column = @Column(name = "item_id", nullable = false, insertable = false, updatable = false)),
          @AttributeOverride(name = "authorId", column = @Column(name = "author_id", nullable = false, insertable = false, updatable = false)),
          @AttributeOverride(name = "authorRoleId", column = @Column(name = "author_role_id", nullable = false, insertable = false, updatable = false))
  })*/
  private ItemAuthorRoleId id;
  @Setter private Item item;
  @Setter private Author author;
  @Setter private AuthorRole authorRole;

  //@MapsId("itemId")
  @ManyToOne(fetch = FetchType.LAZY)
  //@PrimaryKeyJoinColumn(name = "item_id")
  @JoinColumn(name = "item_id", insertable = false, updatable = false, nullable = false)
  public Item getItem()               { return item; }

  //@MapsId("authorId")
  @ManyToOne(fetch = FetchType.LAZY)
  //@PrimaryKeyJoinColumn(name = "author_id")
  @JoinColumn(name = "author_id", insertable = false, updatable = false, nullable = false)
  public Author getAuthor()           { return author; }

  //@MapsId("authorRoleId")
  @ManyToOne(fetch = FetchType.LAZY)
  //@PrimaryKeyJoinColumn(name = "author_role_id")
  @JoinColumn(name = "author_role_id", insertable = false, updatable = false, nullable = false)
  public AuthorRole getAuthorRole()   { return authorRole; }

  @Override
  public boolean equals(Object obj) {
    return this == obj || obj != null && getClass() == obj.getClass();
  }

  @Override
  public int hashCode() {
    return new HashCodeBuilder(17, 31).append(item).append(author).append(authorRole).toHashCode();
  }
}

@Embeddable
class ItemAuthorRoleId implements Serializable {
  @Getter @Setter @Column(name = "item_id", nullable = false) private Integer itemId;
  @Getter @Setter @Column(name = "author_id", nullable = false) private Integer authorId;
  @Getter @Setter @Column(name = "author_role_id", nullable = false) private Integer authorRoleId;

  @Override
  public boolean equals(Object obj) {
    return this == obj || obj != null && getClass() == obj.getClass();
  }

  @Override
  public int hashCode() {
    return new HashCodeBuilder(17, 31).append(itemId).append(authorId).append(authorRoleId).toHashCode();
  }
}


Item

Код: java
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
@Entity
@Table(name = "items")
public class Item extends AbstractModel implements Serializable {
  @Setter private List<Order> orderList;
  @Setter private List<KeyWord> keyWordList;
  @Setter private List<Rubric> rubricList;
  @Setter private Set<ItemAuthorRole> itemAuthorRoleSet;
  @Setter private Set<ItemOrderType> itemOrderTypeSet;
  @Setter private Technic technic;
  @Setter private Era era;
  @Getter @Setter @Embedded private Data data;

  {
    itemAuthorRoleSet = new HashSet<>(0);
    itemOrderTypeSet = new HashSet<>(0);
  }

  @Override
  @SequenceGenerator(name = "isg", sequenceName = "item_sequence", initialValue = 1, allocationSize = 2)
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "isg")
  public Integer getId()                               { return super.getId(); }

  @ManyToMany(mappedBy = "itemList")
  public List<Order> getOrderList()                    { return orderList; }

  @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH}, mappedBy = "item", targetEntity = ItemAuthorRole.class)
  public Set<ItemAuthorRole> getItemAuthorRoleSet()    { return itemAuthorRoleSet; }

  @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH}, mappedBy = "item", targetEntity = ItemOrderType.class)
  public Set<ItemOrderType> getItemOrderTypeSet()      {  return itemOrderTypeSet; }

  @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH})
  @JoinTable(name = "items_keyWords",
          joinColumns = @JoinColumn(name = "item_id"),
          inverseJoinColumns = @JoinColumn(name = "keyWord_id"))
  public List<KeyWord> getKeyWordList()                { return keyWordList; }

  @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH})
  @JoinTable(name = "items_rubrics",
          joinColumns = @JoinColumn(name = "item_id"),
          inverseJoinColumns = @JoinColumn(name = "rubric_id"))
  public List<Rubric> getRubricList()                  { return rubricList; }

  @OneToOne
  @JoinColumn(name = "technic_id")
  public Technic getTechnic()                          { return technic; }

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "era_id")
  public Era getEra()                                  { return era; }

  @Version
  @Column(name = "opt_lock")
  private Long version;
}



пробовал с @AttributeOverrides, с MapsId, с @PrimaryKeyJoinColumn, всегда получаю

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Exception [EclipseLink-48] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [item_author_role.author_id].  Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.OneToOneMapping[author]
Descriptor: RelationalDescriptor(model.item.ItemAuthorRole --> [DatabaseTable(item_author_role)])

Exception [EclipseLink-48] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [item_author_role.item_id].  Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.OneToOneMapping[item]
Descriptor: RelationalDescriptor(model.item.ItemAuthorRole --> [DatabaseTable(item_author_role)])



спасибо
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / jpa 2.1 связь 3х справочников / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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