powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / jpa 2.1 связь 3х справочников
19 сообщений из 19, страница 1 из 1
jpa 2.1 связь 3х справочников
    #38368361
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
jpa 2.1 связь 3х справочников
    #38368432
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breath,
если у тебя много ко многим, так и найди тут рабочий пример поиском
...
Рейтинг: 0 / 0
jpa 2.1 связь 3х справочников
    #38368459
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вместо @ElementCollection следует объявить композит с множеством Set<AuthorRole> внутри, но можно ли это сделать с помощью JPA аннотаций - не знаю.
Композиты поддерживаются в хибернейте (я делал на hiberbnate мэппинге), и вроде в eclipselink начиная с 2.3 что-то есть тоже
...
Рейтинг: 0 / 0
jpa 2.1 связь 3х справочников
    #38369195
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чото не понял,

роль автора должна иметь значение через связь с итемом, типа
Код: 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
jpa 2.1 связь 3х справочников
    #38369242
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathPetro123
многие ко многим с чем ?
весь маппинг делится на виды отношений. 1 к М М к 1 и М к М
Надо начать с него.
...
Рейтинг: 0 / 0
jpa 2.1 связь 3х справочников
    #38369248
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123breathPetro123
многие ко многим с чем ?
весь маппинг делится на виды отношений. 1 к М М к 1 и М к М
Надо начать с него.

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

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

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

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


item
======

author_role
============
3 Админ
55 Секретарь
...
Рейтинг: 0 / 0
jpa 2.1 связь 3х справочников
    #38369320
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
jpa 2.1 связь 3х справочников
    #38369323
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breath,
короче. Моя твоя не понимает.
"Есть 3 справочника", я их не увидел))
Удачи!
...
Рейтинг: 0 / 0
jpa 2.1 связь 3х справочников
    #38369335
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот 3 справочника
items, authors, author_roles
авторы могут быть в разных итемах под разными ролями
например, автор петров в итеме1 имеет роль1, и он же в итеме2 - роль2, а в итеме3 снова роль1 и тд..
просто делать связь много ко многим авторы и роли не прокатит, тогда не вытащить сразу вот это
Код: java
1.
ItemDB.findById(1).getAuthorList().get(1).getAuthorRole();


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

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


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