Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring JPA настройка Entity / 25 сообщений из 26, страница 1 из 2
24.03.2019, 02:14
    #39790514
Dr.Hofmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Всем привет!
Подскажите пожалуйста, есть две энтити связаны друг с другом @OneToMany и @ManyToOne соответственно. Когда через REST запрос выполняется операция DELETE удаляются обе записи в двух таблицах. Какая настройка может сделать так чтобы запись удалялась в одном месте а не тянула все остальные связи???

Вот что делаю:
Код: delete
1.
DELETE http://localhost:8080/spring-mvc-app/categories/1/products/1


НАСТРОЙКИ:

Код: 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.
@Entity
public class Category {
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="CAT_ID")
	private Long id;
	
	@Column(name="CAT_NAME")
	private String name;
	
	@JsonManagedReference
	@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name="CAT_ID")
	@OrderBy
	private Set<Product> products;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
...
.
.



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@Entity
public class Product {
	
	  	@Id
	    @GeneratedValue(strategy=GenerationType.IDENTITY)
	    @Column(name="PRODUCT_ID")
		private Long id;
	  	
	  	@Column(name="PRODUCT_NAME")
	  	private String name;
	  	
	  	@JsonBackReference
	  	@ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
		@JoinColumn(name="CAT_ID")
		private Category category;

		public Long getId() {
			return id;
		}




Код: java
1.
2.
3.
4.
5.
6.
7.
	@Transactional
	@Override
	public void deleteProductById(Long productId) {
		// TODO Auto-generated method stub
		productRepository.deleteById(productId);

	}
...
Рейтинг: 0 / 0
24.03.2019, 04:06
    #39790525
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Dr.Hofmann
Код: java
1.
2.
3.
	  	@ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
		@JoinColumn(name="CAT_ID")
		private Category category;

как вы думаете, что скрывается под CascadeType.ALL?
...
Рейтинг: 0 / 0
24.03.2019, 10:36
    #39790540
shaden
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Dr.Hofmann,

Какая настройка может сделать так чтобы запись удалялась в одном месте а не тянула все остальные связи???

Ответили выше, только есть мнение, что Вы не понимаете, что делаете.
Консистентность данных Вас совсем не волнует?
...
Рейтинг: 0 / 0
24.03.2019, 11:56
    #39790553
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
каскадинг это вообще опасная штука. там одним делетом можно удалить половину базы (или всю)
и вообще многие не рекомендуют юзать каскадинг.
...
Рейтинг: 0 / 0
24.03.2019, 12:05
    #39790555
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
andreykaT,
Смотря где.
Если у вас таблица города и таблица улицы, то почему нет?
...
Рейтинг: 0 / 0
24.03.2019, 12:26
    #39790563
Dr.Hofmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Код: java
1.
2.
3.
	  	@ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
		@JoinColumn(name="CAT_ID")
		private Category category;



Если я убираю cascade=CascadeType.ALL - то у меня вообще не удаляются данные из таблицы product.
Как у вас настроено? Это обычный спринг, не spring boot.
...
Рейтинг: 0 / 0
24.03.2019, 12:37
    #39790564
Dr.Hofmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
авторDr.Hofmann,

Консистентность данных Вас совсем не волнует?


Удалили продукт в категории продуктов который был связан с конкретной категорией из другой таблицы, может такое быть на практике ? Наверное да, Где здесь проблема с консистентностью? Волнует поэтому задаю здесь вопрос.
...
Рейтинг: 0 / 0
24.03.2019, 12:42
    #39790568
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Petro123andreykaT,
Смотря где.
Если у вас таблица города и таблица улицы, то почему нет?
за всем не уследишь :)
...
Рейтинг: 0 / 0
24.03.2019, 12:43
    #39790569
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Dr.HofmannавторDr.Hofmann,

Консистентность данных Вас совсем не волнует?


Удалили продукт в категории продуктов который был связан с конкретной категорией из другой таблицы, может такое быть на практике ? Наверное да, Где здесь проблема с консистентностью? Волнует поэтому задаю здесь вопрос.
а ты как удаляешь? попробуй вначале в продукте убрать категорию а потом делет делай.
...
Рейтинг: 0 / 0
24.03.2019, 12:44
    #39790570
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
shadenDr.Hofmann,

Какая настройка может сделать так чтобы запись удалялась в одном месте а не тянула все остальные связи???

Ответили выше, только есть мнение, что Вы не понимаете, что делаете.
Консистентность данных Вас совсем не волнует?
причем тут консистентность данных?
...
Рейтинг: 0 / 0
24.03.2019, 12:48
    #39790571
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Dr.HofmannЕсли я убираю cascade=CascadeType.ALL - то у меня вообще не удаляются данные из таблицы product.
Во первых - есть очевидное непонимание работы софта "под капотом". Во вторых - при отсутствии понимания можно и не такие фокусы получать.

В общем совет один - зубрить. То есть читать доки и разглядывать кучу примеров из сети.

Читаем сначала про хибер, конкретно про маппинг объектов на таблицы, про все его виды, про общие принципы. Потом (если наступит понимание) читаем про каскадирование, сначала понимаем, что это такое, потом как оно работает. И только после понимания указанных пунктов лезем грязными руками в код и меняем его на правильный, возможно при этом меняя и аннотации. Обращаем внимание на наличие спринга, который так же от неумения и непонимания может внести свою лепту в появление кучи косяков.

На остальные вопросы - как найти доки рассказывать? Гуглить научить? Может ещё и что такое гугл рассказать?
...
Рейтинг: 0 / 0
24.03.2019, 12:52
    #39790573
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
а че в двух словах сказать почему так вместо этого абзаца из ленинской энциклопедии? )
...
Рейтинг: 0 / 0
24.03.2019, 13:17
    #39790578
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
andreykaTPetro123andreykaT,
Смотря где.
Если у вас таблица города и таблица улицы, то почему нет?
за всем не уследишь :)
чтобы не следить и придумали каскад.
Только нужно понимать, что при справочнике городов - города не удаляются. А вот при Округ --> города удаляются.
...
Рейтинг: 0 / 0
24.03.2019, 13:26
    #39790581
Dr.Hofmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
автора ты как удаляешь? попробуй вначале в продукте убрать категорию а потом делет делай.


Зачем категорию удалять если она связана с другими продуктами ???

или вы это предлагаете делать?
авторCategory category = null;
product.setCategory(category);
productRepository.delete(product);



авторНа остальные вопросы - как найти доки рассказывать? Гуглить научить? Может ещё и что такое гугл рассказать?
Гуглил но не нашел еще работающих вариантов.

авторВо первых - есть очевидное непонимание работы софта "под капотом".
SPRING 5 / TOMCAT 9 / JACKSON-DATABIND / spring-data-jpa 2.1.5 / persistence-api 1.0.2 / Hibernate-core 5.4.1
...
Рейтинг: 0 / 0
24.03.2019, 13:36
    #39790585
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
почти ) product.setCategory(null)
...
Рейтинг: 0 / 0
24.03.2019, 13:41
    #39790588
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
я кстати что то такое помню сталкивался несколько раз что у тебя есть поле с фк на другую сущность и после этого оно делетом не хотело удаляться но чот как то решали не помню как. а вообще, удалять прям удалять из базы это как правило, не очень, обычно просто помечают запись удаленной. а не физически ее вытирают.
...
Рейтинг: 0 / 0
24.03.2019, 14:03
    #39790595
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
andreykaTя кстати что то такое помню сталкивался несколько раз что у тебя есть поле с фк на другую сущность и после этого оно делетом не хотело удаляться но чот как то решали не помню как. а вообще, удалять прям удалять из базы это как правило, не очень, обычно просто помечают запись удаленной. а не физически ее вытирают.
-1
FK - это справочная таблица. Из нее никогда не удаляют каскадом.
Полное непонимание работы СУБД, FK, PK и направление связей.
...
Рейтинг: 0 / 0
24.03.2019, 14:07
    #39790596
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
а кто говорит про каскад? чел хочет удалить просто сущность, внутри которой ссылка на другую сущность вот и всё. зачем вы всё усложняете?
...
Рейтинг: 0 / 0
24.03.2019, 14:10
    #39790599
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
andreykaTа кто говорит про каскад? чел хочет удалить просто сущность, внутри которой ссылка на другую сущность вот и всё. зачем вы всё усложняете?я говорю в каких примерах каскад применяется и в каких НЕ применяется.
Ты только про одно - никогда не применять. Так?
...
Рейтинг: 0 / 0
24.03.2019, 14:13
    #39790600
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
я подразумевал что его избегать вовсе, либо применять с осторожностью.
...
Рейтинг: 0 / 0
24.03.2019, 14:19
    #39790602
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
andreykaT,
согласен)
...
Рейтинг: 0 / 0
25.03.2019, 04:56
    #39790719
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Dr.Hofmann
Код: java
1.
2.
3.
	  	@ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
		@JoinColumn(name="CAT_ID")
		private Category category;



Если я убираю cascade=CascadeType.ALL - то у меня вообще не удаляются данные из таблицы product.
Как у вас настроено? Это обычный спринг, не spring boot.Ну вот тут потенциально две беды:
- у вас транзакция активна или нет? без активной транзакции у хибера поведение непредсказуемое
- объявления @OneToMany в родителе в основном нужно для того, чтобы можно было писать запросы с использованием Criteria API: 21836555 , а вы все это дело еще обильно cascade сдобрили, теперь смотрите что получается: вот у вас есть запрос к продукту, в нем стоит eager fetch категории, хибер ее вытягивает после того как вытянул продукт (ну или вместе одним запросом, зависит от того как тянете), дальше он видит что у категории eager fetch на продукты - он их тоже начинает тянуть и прилепливает к категории (ага, получили дополнительные тормоза). Вопрос: вы когда продукт удаляете, теперь то, что нафетчилось в категорию, находится в каком состоянии и как эту категорию сохранять? Согласно спецификации JPA ваш удаленный продукт удалять не нужно если на него или категорию (потому что у вас такой cascade) прилетел persist: 3.2.2 Persisting an Entity Instance- If X is a removed entity, it becomes managed.

- For all entities Y referenced by a relationship from X, if the relationship to Y has been annotated with the cascade element value cascade=PERSIST or cascade=ALL, the persist
operation is applied to Y.
а прилетает в категорию persist или нет - хз, тут уже вам виднее.
...
Рейтинг: 0 / 0
25.03.2019, 11:10
    #39790822
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Андрей Панфилова прилетает в категорию persist или нет - хз, тут уже вам виднее.
Вообще корень зол здесь в том, что хибер полез в дебри и занялся транзакциями, начал делить на managed и прочих, ну и всё в таком духе. Банально не разделены те задачи, которые должны быть разделены, а в результате куча молодняка не может разобраться со всей этой ахинеей.

Нормальный ORM отделяет чистые операции с данными от сервисных, типа транзакций и прочего кэширования. А хибер исторически погряз в смешении сущностей, ну и молодняк на этом практически всегда виснет, как и показывает пример в данной теме.
...
Рейтинг: 0 / 0
25.03.2019, 13:34
    #39790915
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
alex55555Вообще корень зол здесь в том, что хибер полез в дебри и занялся транзакциями, начал делить на managed и прочих, ну и всё в таком духе. Банально не разделены те задачи, которые должны быть разделены, а в результате куча молодняка не может разобраться со всей этой ахинеей.

Нормальный ORM отделяет чистые операции с данными от сервисных, типа транзакций и прочего кэширования. А хибер исторически погряз в смешении сущностей, ну и молодняк на этом практически всегда виснет, как и показывает пример в данной теме.Корень зла вы ищете не там. В конкретном случае ТС не чтит спецификацию (то что спецификация написана через одно место и в хибере (IDE не подсвечивает) не написано как делать нельзя - это другой совсем вопрос). Основная беда в том, что в опенсорс идут индивидуумы, в большинстве своем желающие потешить свое ЧСВ, типа в опенсорсе нет всяких спринтов, дедлайнов, менеджеров и пр., вообщем всего того, что присуще коммерческой разработке, в результате чего на выходе получаем то, что получаем. Ну вот посмотрите чейнджлог последнего релиза жава: новый GC, JMH и новый синтаксис switch - какой-то трешак: от JMH мне ни холодно, ни жарко, и вообще чет не представляю где оно мне может пригодиться, существование годного профайлера было бы в 100 раз полезнее; новый GC - остальные 7 шт (уже счет потерял) оказались говном чтоли? И так везде.
...
Рейтинг: 0 / 0
25.03.2019, 15:17
    #39790992
Dr.Hofmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA настройка Entity
Вообщем, остановился на следующей настройки убрал cascade=CascadeType.ALL из Product, далее установил следующую закономерность что запись из Product удаляется методом crudRepository.delete(product) отправляя product через DELETE /category/{id}/product и он удаляется. До этого использовал deleteById(Long productId) почему-то именно у меня этот метод не работает(только на чистом спринге не SpringBoot). Или чтоб с {id} нужно извращаться получать findById(productId) product, и его уже удалять вторым этапом.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring JPA настройка Entity / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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