Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Spring JPA настройка Entity  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Всем привет!
Подскажите пожалуйста, есть две энтити связаны друг с другом @OneToMany и @ManyToOne соответственно. Когда через REST запрос выполняется операция DELETE удаляются обе записи в двух таблицах. Какая настройка может сделать так чтобы запись удалялась в одном месте а не тянула все остальные связи???

Вот что делаю:

DELETE http://localhost:8080/spring-mvc-app/categories/1/products/1


НАСТРОЙКИ:

@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() {
...
.
.


@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;
		}



	@Transactional
	@Override
	public void deleteProductById(Long productId) {
		// TODO Auto-generated method stub
		productRepository.deleteById(productId);

	}
24 мар 19, 02:14    [21841841]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3351
Dr.Hofmann
	  	@ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
		@JoinColumn(name="CAT_ID")
		private Category category;
как вы думаете, что скрывается под CascadeType.ALL?
24 мар 19, 04:06    [21841860]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
shaden
Member

Откуда: Башкортостан
Сообщений: 165
Dr.Hofmann,

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

Ответили выше, только есть мнение, что Вы не понимаете, что делаете.
Консистентность данных Вас совсем не волнует?
24 мар 19, 10:36    [21841918]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
каскадинг это вообще опасная штука. там одним делетом можно удалить половину базы (или всю)
и вообще многие не рекомендуют юзать каскадинг.
24 мар 19, 11:56    [21841952]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
andreykaT,
Смотря где.
Если у вас таблица города и таблица улицы, то почему нет?
24 мар 19, 12:05    [21841955]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
	  	@ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
		@JoinColumn(name="CAT_ID")
		private Category category;


Если я убираю cascade=CascadeType.ALL - то у меня вообще не удаляются данные из таблицы product.
Как у вас настроено? Это обычный спринг, не spring boot.
24 мар 19, 12:26    [21841964]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
автор
Dr.Hofmann,

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


Удалили продукт в категории продуктов который был связан с конкретной категорией из другой таблицы, может такое быть на практике ? Наверное да, Где здесь проблема с консистентностью? Волнует поэтому задаю здесь вопрос.
24 мар 19, 12:37    [21841969]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
Petro123
andreykaT,
Смотря где.
Если у вас таблица города и таблица улицы, то почему нет?

за всем не уследишь :)
24 мар 19, 12:42    [21841974]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
Dr.Hofmann
автор
Dr.Hofmann,

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


Удалили продукт в категории продуктов который был связан с конкретной категорией из другой таблицы, может такое быть на практике ? Наверное да, Где здесь проблема с консистентностью? Волнует поэтому задаю здесь вопрос.

а ты как удаляешь? попробуй вначале в продукте убрать категорию а потом делет делай.
24 мар 19, 12:43    [21841975]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
shaden
Dr.Hofmann,

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

Ответили выше, только есть мнение, что Вы не понимаете, что делаете.
Консистентность данных Вас совсем не волнует?

причем тут консистентность данных?
24 мар 19, 12:44    [21841976]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
alex55555
Member

Откуда:
Сообщений: 2128
Dr.Hofmann
Если я убираю cascade=CascadeType.ALL - то у меня вообще не удаляются данные из таблицы product.

Во первых - есть очевидное непонимание работы софта "под капотом". Во вторых - при отсутствии понимания можно и не такие фокусы получать.

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

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

На остальные вопросы - как найти доки рассказывать? Гуглить научить? Может ещё и что такое гугл рассказать?
24 мар 19, 12:48    [21841978]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
а че в двух словах сказать почему так вместо этого абзаца из ленинской энциклопедии? )
24 мар 19, 12:52    [21841981]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
andreykaT
Petro123
andreykaT,
Смотря где.
Если у вас таблица города и таблица улицы, то почему нет?

за всем не уследишь :)

чтобы не следить и придумали каскад.
Только нужно понимать, что при справочнике городов - города не удаляются. А вот при Округ --> города удаляются.
24 мар 19, 13:17    [21841992]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
автор
а ты как удаляешь? попробуй вначале в продукте убрать категорию а потом делет делай.


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

или вы это предлагаете делать?
автор
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
24 мар 19, 13:26    [21841996]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
почти ) product.setCategory(null)
24 мар 19, 13:36    [21842002]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
я кстати что то такое помню сталкивался несколько раз что у тебя есть поле с фк на другую сущность и после этого оно делетом не хотело удаляться но чот как то решали не помню как. а вообще, удалять прям удалять из базы это как правило, не очень, обычно просто помечают запись удаленной. а не физически ее вытирают.
24 мар 19, 13:41    [21842005]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
andreykaT
я кстати что то такое помню сталкивался несколько раз что у тебя есть поле с фк на другую сущность и после этого оно делетом не хотело удаляться но чот как то решали не помню как. а вообще, удалять прям удалять из базы это как правило, не очень, обычно просто помечают запись удаленной. а не физически ее вытирают.

-1
FK - это справочная таблица. Из нее никогда не удаляют каскадом.
Полное непонимание работы СУБД, FK, PK и направление связей.
24 мар 19, 14:03    [21842013]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
а кто говорит про каскад? чел хочет удалить просто сущность, внутри которой ссылка на другую сущность вот и всё. зачем вы всё усложняете?
24 мар 19, 14:07    [21842016]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
andreykaT
а кто говорит про каскад? чел хочет удалить просто сущность, внутри которой ссылка на другую сущность вот и всё. зачем вы всё усложняете?
я говорю в каких примерах каскад применяется и в каких НЕ применяется.
Ты только про одно - никогда не применять. Так?
24 мар 19, 14:10    [21842019]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
andreykaT
Member

Откуда:
Сообщений: 2431
я подразумевал что его избегать вовсе, либо применять с осторожностью.
24 мар 19, 14:13    [21842021]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
andreykaT,
согласен)
24 мар 19, 14:19    [21842025]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3351
Dr.Hofmann
	  	@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 или нет - хз, тут уже вам виднее.
25 мар 19, 04:56    [21842367]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
alex55555
Member

Откуда:
Сообщений: 2128
Андрей Панфилов
а прилетает в категорию persist или нет - хз, тут уже вам виднее.

Вообще корень зол здесь в том, что хибер полез в дебри и занялся транзакциями, начал делить на managed и прочих, ну и всё в таком духе. Банально не разделены те задачи, которые должны быть разделены, а в результате куча молодняка не может разобраться со всей этой ахинеей.

Нормальный ORM отделяет чистые операции с данными от сервисных, типа транзакций и прочего кэширования. А хибер исторически погряз в смешении сущностей, ну и молодняк на этом практически всегда виснет, как и показывает пример в данной теме.
25 мар 19, 11:10    [21842521]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3351
alex55555
Вообще корень зол здесь в том, что хибер полез в дебри и занялся транзакциями, начал делить на managed и прочих, ну и всё в таком духе. Банально не разделены те задачи, которые должны быть разделены, а в результате куча молодняка не может разобраться со всей этой ахинеей.

Нормальный ORM отделяет чистые операции с данными от сервисных, типа транзакций и прочего кэширования. А хибер исторически погряз в смешении сущностей, ну и молодняк на этом практически всегда виснет, как и показывает пример в данной теме.
Корень зла вы ищете не там. В конкретном случае ТС не чтит спецификацию (то что спецификация написана через одно место и в хибере (IDE не подсвечивает) не написано как делать нельзя - это другой совсем вопрос). Основная беда в том, что в опенсорс идут индивидуумы, в большинстве своем желающие потешить свое ЧСВ, типа в опенсорсе нет всяких спринтов, дедлайнов, менеджеров и пр., вообщем всего того, что присуще коммерческой разработке, в результате чего на выходе получаем то, что получаем. Ну вот посмотрите чейнджлог последнего релиза жава: новый GC, JMH и новый синтаксис switch - какой-то трешак: от JMH мне ни холодно, ни жарко, и вообще чет не представляю где оно мне может пригодиться, существование годного профайлера было бы в 100 раз полезнее; новый GC - остальные 7 шт (уже счет потерял) оказались говном чтоли? И так везде.
25 мар 19, 13:34    [21842728]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Вообщем, остановился на следующей настройки убрал cascade=CascadeType.ALL из Product, далее установил следующую закономерность что запись из Product удаляется методом crudRepository.delete(product) отправляя product через DELETE /category/{id}/product и он удаляется. До этого использовал deleteById(Long productId) почему-то именно у меня этот метод не работает(только на чистом спринге не SpringBoot). Или чтоб с {id} нужно извращаться получать findById(productId) product, и его уже удалять вторым этапом.
25 мар 19, 15:17    [21842875]     Ответить | Цитировать Сообщить модератору
 Re: Spring JPA настройка Entity  [new]
alex55555
Member

Откуда:
Сообщений: 2128
Андрей Панфилов
Основная беда в том, что в опенсорс идут индивидуумы...

Ну если совсем уж расширять, то и это не главная проблема.

Конкретно в данной теме автор не понимает как работает библиотека. Это непонимание возникает не только от лени автора, но и в следствии лени авторов библиотеки, не давших подробного описания. А лень авторов библиотеки вытекает из широкого замаха авторов, который и привёл к ненужному усложнению системы, которую сами авторы теперь не могут подробно описать, ну а молодёжь не может нормально использовать.
26 мар 19, 11:53    [21843564]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Java Ответить