powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Unidirectional
14 сообщений из 14, страница 1 из 1
Hibernate Unidirectional
    #39051199
doofy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Пожалуйста помогите разобраться в однонаправленной связи.
Вот здесь очень хороший пример Bidirectional один-ко-многим(если я не ошибаюсь, то тогда я хорошо понял о чем там речь).

Что мне нужно:
Возьмем старую добрую связь из двух таблиц "Заказ"-"Строки заказа":

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Entity
@Table(name = "order")
public class Order {
	private Long idOrder;
...//getters setters
}

@Entity
@Table(name = "str_order")
public class StrOrder {
	private Long idStrOrder;
	private Long idFkOrder;
	private String col;
...//getters setters
}


Мне нужно сделать как в этом примере(указывал его выше), но не ссылаясь на Order. Т.е. если у меня есть Заказ то я могу получить список его строк getListStrOrder().
Что то типо:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Order order;
order = (Order) session.get(Order.class, (long) 1);
Set<StrOrder> listStrOrder;
listStrOrder = order.getListStrOrder();

	System.out.println("StrOrder:\n");
	Set<StrOrder> sets = order.getListStrOrder();
	Iterator iterator = sets.iterator();
	while (iterator.hasNext()) {
		StrOrder element = (StrOrder) iterator.next();
		System.out.println(element.getCol());
	}


Читал и тут и вот тут и много еще где, но я совершенно НЕ понимаю как писать...
Если вам не сложно подскажите как это реализовать.
Или литературу понятную.
Заранее спасибо!
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051204
doofy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если говорить о данном примере , то мне в StockDailyRecord совершенно НЕ нужен объект Stock:
Код: java
1.
2.
3.
4.
5.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STOCK_ID", nullable = false)
public Stock getStock() {
	return this.stock;
}
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051225
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так?

Код: java
1.
2.
@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL}, mappedBy="order")
Set<StrOrder> strOrderSet;
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051351
doofy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
z3r9,

Насколько я понимаю если я напишу вот так
Код: java
1.
mappedBy="order"


То мне придется создать объект Order в классе StrOrder, а я как раз таки пытаюсь уйти от этого. В любом случае вот ошибка:
Код: java
1.
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: artifactID.domain.StrOrder.order in artifactID.domain.Order.listStrOrder
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051357
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doofyсовершенно НЕ нужен объект Stock:
что значит не нужен?
Ты спроси БД, нужен ли он там.
Да, можно понаписать в СУБД всяких там таблица в таблице или массив в колонке, но уж лучше по классике.
1 ко многим = 2 таблицы.
Тем более что у тебя всё равно будут в Заказе какие-то шапочные данные-поля (номер\дата\....)
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051361
doofy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
Petro123Да, можно понаписать в СУБД всяких там таблица в таблице или массив в колонке, но уж лучше по классике.
1 ко многим = 2 таблицы.
О чем это вы? У меня классический пример для реляционной БД "заказ"-"строки заказа" отношение 1-* соответственно. Я же это уже написал.

Я говорю о том, что в Order список строк заказа оправдан (речь идет классах JAVA), а вот в каждой строке иметь заказ это лишнее.(это есть двунаправленная связь)
Мне же нужна однонаправленная.
Например у меня есть какой-нибудь метод, который вернет мне Заказ я хочу иметь возможность получить все его строки getList(). Зачем мне при этом в каждой из этих строк иметь опять таки этот заказ???

Простите но ваша мысль мне не ясна...
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051363
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doofy,
ну, может я вас не понял?
- сам маппинг и 2-е таблицы в БД есть. Т.е. Модель работает. Так?
- вопрос только в методе получения инфы из БД. Т.е. оптимизировать запрос. Так?
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051370
doofy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

В БД есть две таблицы это верно.
Проблема в мапинге. Загвоздка у меня в том, как аннотациями показать hibernate связь между таблицами, при этом связь должна быть unidirectional. (Order должен уметь получать список StrOrder, а StrOrder не должен ничего знать об Order)
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051616
xifr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doofy,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
public class Employee {
  @Id
  @Column(name="EMP_ID")
  private long id;
  ...
  @OneToMany
  @JoinColumn(name="OWNER_ID", referencedColumnName="EMP_ID")
  private List<Phone> phones;
  ...
}
@Entity
public class Phone {
  @Id
  private long id;
  ...
}



Пример с Unidirectional OneToMany
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39051739
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doofyPetro123,

В БД есть две таблицы это верно.
Проблема в мапинге. Загвоздка у меня в том, как аннотациями показать hibernate связь между таблицами, при этом связь должна быть unidirectional. (Order должен уметь получать список StrOrder, а StrOrder не должен ничего знать об Order)
Так не делай в классе StrOrder поле Order и все. И будет unidirectional. Никакие mappedBy не надо.
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39052020
doofy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdm,

Оооо, я бы с радостью так бы и поступил! Если бы не:
Код: java
1.
Initial SessionFactory creation failed.org.hibernate.MappingException: Repeated column in mapping for entity: artifactID.domain.StrOrder column: id_fk_order (should be mapped with insert="false" update="false")


Если уберу мапинг в StrOrder:
Код: java
1.
2.
3.
4.
@Column(name = "id_fk_order", nullable = false)
public Long getIdFkOrder() {
	return idFkOrder;
}


ошибка будет исправлена, но тогда класс не будет ничего знать о внешнем ключе "id_fk_order"...
Подозреваю что просто так убрать оттуда Order не получится.
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39052253
doofy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я не понимаю каких-то концептуальных вещей в hibernate. Цель была получить работающий код за разумные сроки...
Возможно данное решение в корни неверное, но вдруг кому-то пригодится...
Вот так я решил свою задачу:

Код: 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.
@Entity
@Table(name = "str_order")
public class StrOrder {
	private Long idStrOrder;
//	private Long idFkOrder;
	private String col;

	@Id
	@GeneratedValue
	@Column(name = "id_str_order", nullable = false)
	public Long getIdStrOrder() {
		return idStrOrder;
	}

	public void setIdStrOrder(Long idStrOrder) {
		this.idStrOrder = idStrOrder;
	}

//	@Column(name = "id_fk_order", nullable = false)
//	public Long getIdFkOrder() {
//		return idFkOrder;
//	}
//
//	public void setIdFkOrder(Long idFkOrder) {
//		this.idFkOrder = idFkOrder;
//	}

	@Column(name = "col", nullable = false)
	public String getCol() {
		return col;
	}

	public void setCol(String col) {
		this.col = col;
	}
}


Код: 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.
@Entity
@Table(name = "order")
public class Order implements Serializable{
	private Long idOrder;
	private String col;
	private Set<StrOrder> listStrOrder;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_order", nullable = false)
	public Long getIdOrder() {
		return idOrder;
	}

	public void setIdOrder(Long idOrder) {
		this.idOrder = idOrder;
	}

	@Column(name = "col", nullable = false)
	public String getCol() {
		return col;
	}

	public void setCol(String col) {
		this.col = col;
	}
	
	@OneToMany(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_fk_order", nullable = false)
	public Set<StrOrder> getListStrOrder() {
		return listStrOrder;

	}

	public void setListStrOrder(Set<StrOrder> listStrOrder) {
		this.listStrOrder = listStrOrder;
	}
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Main {

	public static void main(String[] args) {
		System.out.println("Hibernate one to many (Annotation)");
		Session session = HibernateUtil.getSessionFactory().openSession();
		

			Order order = null;
			order = (Order) session.get(Order.class, (long) 1);
			System.out.println("Order:");
			System.out.println(order.getCol());

			System.out.println("StrOrder:\n");
			Set<StrOrder> sets = order.getListStrOrder();
			Iterator iterator = sets.iterator();
			while (iterator.hasNext()) {
				StrOrder element = (StrOrder) iterator.next();
				System.out.println(element.getCol());
			}
	}
}


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE `order` (
  `id_order` int(11) NOT NULL AUTO_INCREMENT,
  `col` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `str_order` (
  `id_str_order` int(11) NOT NULL AUTO_INCREMENT,
  `id_fk_order` int(11) NOT NULL,
  `col` varchar(45) NOT NULL,
  PRIMARY KEY (`id_str_order`),
  KEY `id_fk_order` (`id_fk_order`),
  CONSTRAINT `id_fk_order` FOREIGN KEY (`id_fk_order`) REFERENCES `order` (`id_order`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39052271
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doofy, http://download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/index.html

2.10.5.1 Unidirectional OneToMany Relationships

The following mapping defaults apply:

Entity A is mapped to a table named A.
Entity B is mapped to a table named B.

There is a join table that is named A_B (owner name first). This join table has two foreign key
columns. One foreign key column refers to table A and has the same type as the primary key of
table A. The name of this foreign key column is formed as the concatenation of the following:
the name of entity A; "_"; the name of the primary key column in table A. The other foreign
key column refers to table B and has the same type as the primary key of table B and there is a
unique key constraint on it. The name of this foreign key column is formed as the concatenation
of the following: the name of the relationship property or field of entity A; "_"; the name
of the primary key column in table B.


Example:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Entity
public class Employee {
 private Collection<AnnualReview> annualReviews;
 @OneToMany
 public Collection<AnnualReview> getAnnualReviews() {
 return annualReviews;
 }
 public void setAnnualReviews(Collection<AnnualReview> annualReviews) {
 this.annualReviews = annualReviews;
 }
 ...
}
@Entity
public class AnnualReview {
 ...
}



In this example:
Entity Employee references a collection of Entity AnnualReview.
Entity AnnualReview does not reference Entity Employee.
Entity Employee is the owner of the relationship.

The following mapping defaults apply:
Entity Employee is mapped to a table named EMPLOYEE.
Entity AnnualReview is mapped to a table named ANNUALREVIEW.
There is a join table that is named EMPLOYEE_ANNUALREVIEW (owner name first). This
join table has two foreign key columns. One foreign key column refers to table EMPLOYEE
and has the same type as the primary key of EMPLOYEE. This foreign key column is named
EMPLOYEE_<PK of EMPLOYEE>, where <PK of EMPLOYEE> denotes the name of the
primary key column of table EMPLOYEE. The other foreign key column refers to table ANNUALREVIEW
and has the same type as the primary key of ANNUALREVIEW. This foreign key
column is named ANNUALREVIEWS_<PK of ANNUALREVIEW>, where <PK of ANNUALREVIEW>
denotes the name of the primary key column of table ANNUALREVIEW. There
is a unique key constraint on the foreign key that refers to table ANNUALREVIEW.
...
Рейтинг: 0 / 0
Hibernate Unidirectional
    #39052274
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
There is a join table that is named EMPLOYEE_ANNUALREVIEW (owner name first). This
join table has two foreign key columns.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Unidirectional
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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