powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring JPA настройка Entity
26 сообщений из 26, показаны все 2 страниц
Spring JPA настройка Entity
    #39790514
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Подскажите пожалуйста, есть две энтити связаны друг с другом @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
Spring JPA настройка Entity
    #39790525
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.Hofmann
Код: java
1.
2.
3.
	  	@ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
		@JoinColumn(name="CAT_ID")
		private Category category;

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

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

Ответили выше, только есть мнение, что Вы не понимаете, что делаете.
Консистентность данных Вас совсем не волнует?
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790553
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
каскадинг это вообще опасная штука. там одним делетом можно удалить половину базы (или всю)
и вообще многие не рекомендуют юзать каскадинг.
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790555
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,
Смотря где.
Если у вас таблица города и таблица улицы, то почему нет?
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790563
Фотография 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.
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790564
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторDr.Hofmann,

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


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

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


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

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

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

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

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

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


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

или вы это предлагаете делать?
автор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
Spring JPA настройка Entity
    #39790585
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почти ) product.setCategory(null)
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790588
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я кстати что то такое помню сталкивался несколько раз что у тебя есть поле с фк на другую сущность и после этого оно делетом не хотело удаляться но чот как то решали не помню как. а вообще, удалять прям удалять из базы это как правило, не очень, обычно просто помечают запись удаленной. а не физически ее вытирают.
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790595
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTя кстати что то такое помню сталкивался несколько раз что у тебя есть поле с фк на другую сущность и после этого оно делетом не хотело удаляться но чот как то решали не помню как. а вообще, удалять прям удалять из базы это как правило, не очень, обычно просто помечают запись удаленной. а не физически ее вытирают.
-1
FK - это справочная таблица. Из нее никогда не удаляют каскадом.
Полное непонимание работы СУБД, FK, PK и направление связей.
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790596
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а кто говорит про каскад? чел хочет удалить просто сущность, внутри которой ссылка на другую сущность вот и всё. зачем вы всё усложняете?
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790599
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTа кто говорит про каскад? чел хочет удалить просто сущность, внутри которой ссылка на другую сущность вот и всё. зачем вы всё усложняете?я говорю в каких примерах каскад применяется и в каких НЕ применяется.
Ты только про одно - никогда не применять. Так?
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790600
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я подразумевал что его избегать вовсе, либо применять с осторожностью.
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790602
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,
согласен)
...
Рейтинг: 0 / 0
Spring JPA настройка Entity
    #39790719
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Spring JPA настройка Entity
    #39790822
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилова прилетает в категорию persist или нет - хз, тут уже вам виднее.
Вообще корень зол здесь в том, что хибер полез в дебри и занялся транзакциями, начал делить на managed и прочих, ну и всё в таком духе. Банально не разделены те задачи, которые должны быть разделены, а в результате куча молодняка не может разобраться со всей этой ахинеей.

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

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

Конкретно в данной теме автор не понимает как работает библиотека. Это непонимание возникает не только от лени автора, но и в следствии лени авторов библиотеки, не давших подробного описания. А лень авторов библиотеки вытекает из широкого замаха авторов, который и привёл к ненужному усложнению системы, которую сами авторы теперь не могут подробно описать, ну а молодёжь не может нормально использовать.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring JPA настройка Entity
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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