powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / [Hibernate] Many to Many - Delete record from Join Table by Id
13 сообщений из 13, страница 1 из 1
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39116781
meph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь влюбиться в Хибер, но пока этот процесс идет туговато. Помогите, люди добрые.

Есть довольно тривиальная ситуация с Many to Many - 3 entity: Users, Tickets, Comments (id, id_user, id_ticket, comment, comment_date). Я воспользовался одним из туториалов, где предлагается создать класс для композитного ключа.

User.java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Table(name = "users")
public class User extends AbstractPersistable<Long>{

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user", cascade={CascadeType.PERSIST, CascadeType.MERGE})
	Set<Action> UserTickets = new HashSet<Action>();
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user", cascade={CascadeType.PERSIST, CascadeType.MERGE})
	Set<Comment> UserComments = new HashSet<Comment>();

	@JsonView(com.example.entity.User.class)
	@Column(name = "login", unique = true, nullable = false, length = 255)
	private String login;

	@Column(name = "password", unique = false, nullable = false, length = 255)
	private String password;
...




Ticket.java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Entity
@Table(name = "tickets")
public class Ticket extends AbstractPersistable<Long>{

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.ticket", cascade={CascadeType.PERSIST, CascadeType.MERGE})
	Set<Action> UserTickets = new HashSet<Action>();

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.ticket", cascade={CascadeType.PERSIST, CascadeType.MERGE})
	Set<Comment> UserComments = new HashSet<Comment>();

	private static final long serialVersionUID = 8640946894564355389L;

	@JsonView(com.example.entity.Ticket.class)
	@Column(name = "title", unique = false, nullable = false, length = 255)
	private String title;
...




Comment.java

Код: 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.
@Entity
@Table(name = "comments")
@AssociationOverrides({ @AssociationOverride(name = "pk.user", joinColumns = @JoinColumn(name = "id_user") ),
						@AssociationOverride(name = "pk.ticket", joinColumns = @JoinColumn(name = "id_ticket") ) })
public class Comment {
	private CommentID pk = new CommentID();

	@JsonView(com.example.entity.Comment.class)
	@Column(name = "comment", nullable = false, length = 255)
	private String comment;

	@JsonView(com.example.entity.Comment.class)
	@Column(name = "comment_date", nullable = false, length = 255)
	private String commentDate;

	@EmbeddedId
	public CommentID getPk() {
		return pk;
	}

	public void setPk(CommentID pk) {
		this.pk = pk;
	}
...




CommentID.java

Код: 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.
@Embeddable
public class CommentID implements java.io.Serializable {

	private static final long serialVersionUID = -5185832235301640383L;
	
	@Id
	private Long id;
	
	private User user;
	
    private Ticket ticket;

    
    public Long getId() {
		return id;
	}

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

	@ManyToOne
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user=user;
    }

    @ManyToOne
    public Ticket getTicket() {
        return ticket;
    }

    public void setTicket(Ticket ticket) {
        this.ticket=ticket;
    }
...



В качестве repository использую голый CrudRepository.

Все вроде бы хорошо, пока мне не пришла в голову идея удалить комментарий по ID.

Если удаляю через Long:
Код: java
1.
commentRepository.delete(commentItem.getPk().getId());

то получаю
Код: java
1.
Provided id of the wrong type for class com.example.entity.Comment. Expected: class com.example.entity.CommentID, got class java.lang.Long



Вроде бы логично, но у CrudRepository не метода удаления с таким параметром. Стоит ли его создать самому, или же это идеологически неверно?

Если улаляю через Comment
Код: java
1.
commentRepository.delete(commentItem);

то Хибер просто не видет изменений и ничего не делает.

Наверняка можно написать метод для удаления с нативным сиквель запросом или придумать еще какие-то костыли, но хочется сделать это средствами CrudRepository без свистоплясок. Покажите направление куда копать, товарищи.
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117085
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mephЕсли удаляю через Long:
Код: java
1.
commentRepository.delete(commentItem.getPk().getId());

то получаю
Код: java
1.
Provided id of the wrong type for class com.example.entity.Comment. Expected: class com.example.entity.CommentID, got class java.lang.Long



Вроде бы логично, но у CrudRepository не метода удаления с таким параметром. Стоит ли его создать самому, или же это идеологически неверно?

Если улаляю через Comment
Код: java
1.
commentRepository.delete(commentItem);

то Хибер просто не видет изменений и ничего не делает.

А что с вариантом удаления непосредственно по PK?
Код: java
1.
commentRepository.delete(commentItem.getPK());
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117617
meph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczА что с вариантом удаления непосредственно по PK?
Код: java
1.
commentRepository.delete(commentItem.getPK());



Это первое, что пришло в голову после того, как удаление через Long не сработало.

Однако commentRepository (он же CrudRepository) из коробки умеет удалять либо через Long, либо через Comment. Стоит ли мне добавить в commentRepository метод delete(CommentID сommentID) ? Хотелось бы понять в правильном ли направлении я двигаюсь, или же такой подход выглядит совсем не кошерно? Как принято в ваших этих Спрингах?
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117635
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meph,

А почему вас CrudRepository<Comment, Long> вместо CrudRepository<Comment, CommentID> ?
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117696
meph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

отличный вопрос :) конечно же ваша правда, не знаю чем я думал, когда оставил там Long.

Исправил CommentRepository:

Код: java
1.
2.
3.
4.
@Repository
public interface CommentRepository extends CrudRepository<Comment, CommentID> {

}



В контроллере метод выглядит так (не могу сказать, что мне нравится цикл, ну да ладно):

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	@RequestMapping(value = "/api/ticket/{ticketId}/deleteComment/{commentId}", method = RequestMethod.DELETE)
        @ResponseStatus(HttpStatus.OK)
	public void deleteComment(@PathVariable("ticketId") Long ticketId, @PathVariable("commentId") Long commentId) {
		System.out.println("---");
		
		// find ticket
		Ticket ticket = ticketRepository.findOne(ticketId);
		if (ticket == null) {
			throw new NotFoundException(ticketId.toString() + "(Ticket)");
		}

		Set<Comment> commentsList = ticket.getUserComments();
		for (Comment commentItem : commentsList) {
			if (commentItem.getPk().getId().equals(commentId)) {
				System.out.println("delete comment by ID: " + commentItem.getPk().getId());
				commentRepository.delete(commentItem.getPk());
			}
		}




К сожалению, запись по-прежнему не удаляется. Логи выглядят немного подозрительно, особенно в месте Listing entities.

Код: 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.
stomAnnotationTransactionAttributeSource : Adding transactional method 'findOne' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
o.h.e.j.internal.LogicalConnectionImpl   : Obtaining JDBC connection
o.h.e.j.internal.LogicalConnectionImpl   : Obtained JDBC connection
o.h.e.t.spi.AbstractTransactionImpl      : begin
o.h.e.t.internal.jdbc.JdbcTransaction    : initial autocommit status: true
o.h.e.t.internal.jdbc.JdbcTransaction    : disabling autocommit
ataPostProcessor$ThreadBoundTargetSource : Initializing lazy target object
org.hibernate.SQL                        : select ticket0_.id as id1_2_0_, ticket0_.description as descript2_2_0_, ticket0_.priority as priority3_2_0_, ticket0_.status as status4_2_0_, ticket0_.ticket_added as ticket_a5_2_0_, ticket0_.ticket_updated as ticket_u6_2_0_, ticket0_.title as title7_2_0_ from tickets ticket0_ where ticket0_.id=?
Hibernate: select ticket0_.id as id1_2_0_, ticket0_.description as descript2_2_0_, ticket0_.priority as priority3_2_0_, ticket0_.status as status4_2_0_, ticket0_.ticket_added as ticket_a5_2_0_, ticket0_.ticket_updated as ticket_u6_2_0_, ticket0_.title as title7_2_0_ from tickets ticket0_ where ticket0_.id=?
o.h.l.p.e.p.i.ResultSetProcessorImpl     : Starting ResultSet row #0
l.p.e.p.i.EntityReferenceInitializerImpl : On call to EntityIdentifierReaderImpl#resolve, EntityKey was already known; should only happen on root returns with an optional identifier specified
o.h.engine.internal.TwoPhaseLoad         : Resolving associations for [com.example.entity.Ticket#4]
o.h.engine.internal.TwoPhaseLoad         : Done materializing entity [com.example.entity.Ticket#4]
.l.e.p.AbstractLoadPlanBasedEntityLoader : Done entity load : com.example.entity.Ticket#4
o.h.e.t.spi.AbstractTransactionImpl      : committing
o.h.e.t.internal.jdbc.JdbcTransaction    : committed JDBC Connection
o.h.e.t.internal.jdbc.JdbcTransaction    : re-enabling autocommit
stractLoadPlanBasedCollectionInitializer : Loading collection: [com.example.entity.Ticket.UserComments#4]
org.hibernate.SQL                        : select usercommen0_.id_ticket as id_ticke5_2_0_, usercommen0_.id as id1_1_0_, usercommen0_.id_ticket as id_ticke5_1_0_, usercommen0_.id_user as id_user4_1_0_, usercommen0_.id as id1_1_1_, usercommen0_.id_ticket as id_ticke5_1_1_, usercommen0_.id_user as id_user4_1_1_, usercommen0_.comment as comment2_1_1_, usercommen0_.comment_date as comment_3_1_1_, user1_.id as id1_3_2_, user1_.first_name as first_na2_3_2_, user1_.last_name as last_nam3_3_2_, user1_.login as login4_3_2_, user1_.password as password5_3_2_, user1_.status as status6_3_2_ from comments usercommen0_ left outer join users user1_ on usercommen0_.id_user=user1_.id where usercommen0_.id_ticket=?
Hibernate: select usercommen0_.id_ticket as id_ticke5_2_0_, usercommen0_.id as id1_1_0_, usercommen0_.id_ticket as id_ticke5_1_0_, usercommen0_.id_user as id_user4_1_0_, usercommen0_.id as id1_1_1_, usercommen0_.id_ticket as id_ticke5_1_1_, usercommen0_.id_user as id_user4_1_1_, usercommen0_.comment as comment2_1_1_, usercommen0_.comment_date as comment_3_1_1_, user1_.id as id1_3_2_, user1_.first_name as first_na2_3_2_, user1_.last_name as last_nam3_3_2_, user1_.login as login4_3_2_, user1_.password as password5_3_2_, user1_.status as status6_3_2_ from comments usercommen0_ left outer join users user1_ on usercommen0_.id_user=user1_.id where usercommen0_.id_ticket=?
o.h.l.p.e.p.i.ResultSetProcessorImpl     : Preparing collection intializer : [com.example.entity.Ticket.UserComments#4]
o.h.l.p.e.p.i.ResultSetProcessorImpl     : Starting ResultSet row #0
l.p.e.p.i.EntityReferenceInitializerImpl : On call to EntityIdentifierReaderImpl#resolve, EntityKey was already known; should only happen on root returns with an optional identifier specified
e.p.i.CollectionReferenceInitializerImpl : Found row of collection: [com.example.entity.Ticket.UserComments#4]
o.h.engine.internal.TwoPhaseLoad         : Resolving associations for [com.example.entity.User#8]
o.h.engine.internal.TwoPhaseLoad         : Done materializing entity [com.example.entity.User#8]
o.h.engine.internal.TwoPhaseLoad         : Resolving associations for [com.example.entity.Comment#component[id,ticket,user]{ticket=com.example.entity.Ticket#4, id=3, user=com.example.entity.User#8}]
o.h.engine.internal.TwoPhaseLoad         : Done materializing entity [com.example.entity.Comment#component[id,ticket,user]{ticket=com.example.entity.Ticket#4, id=3, user=com.example.entity.User#8}]
o.h.e.l.internal.CollectionLoadContext   : 1 collections were found in result set for role: com.example.entity.Ticket.UserComments
o.h.e.l.internal.CollectionLoadContext   : Collection fully initialized: [com.example.entity.Ticket.UserComments#4]
o.h.e.l.internal.CollectionLoadContext   : 1 collections initialized for role: com.example.entity.Ticket.UserComments
stractLoadPlanBasedCollectionInitializer : Done loading collection
delete comment by ID: 3
stomAnnotationTransactionAttributeSource : Adding transactional method 'delete' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
o.h.e.t.spi.AbstractTransactionImpl      : begin
o.h.e.t.internal.jdbc.JdbcTransaction    : initial autocommit status: true
o.h.e.t.internal.jdbc.JdbcTransaction    : disabling autocommit
ataPostProcessor$ThreadBoundTargetSource : Initializing lazy target object
o.h.e.t.spi.AbstractTransactionImpl      : committing
o.h.e.i.AbstractFlushingEventListener    : Processing flush-time cascades
o.h.e.i.AbstractFlushingEventListener    : Dirty checking collections
o.hibernate.engine.internal.Collections  : Collection found: [com.example.entity.Ticket.UserComments#4], was: [com.example.entity.Ticket.UserComments#4] (initialized)
o.hibernate.engine.internal.Collections  : Collection found: [com.example.entity.Ticket.UserTickets#4], was: [com.example.entity.Ticket.UserTickets#4] (uninitialized)
o.hibernate.engine.internal.Collections  : Collection found: [com.example.entity.User.UserComments#8], was: [com.example.entity.User.UserComments#8] (uninitialized)
o.hibernate.engine.internal.Collections  : Collection found: [com.example.entity.User.UserTickets#8], was: [com.example.entity.User.UserTickets#8] (uninitialized)
o.h.e.i.AbstractFlushingEventListener    : Flushed: 0 insertions, 0 updates, 0 deletions to 3 objects
o.h.e.i.AbstractFlushingEventListener    : Flushed: 0 (re)creations, 0 updates, 0 removals to 4 collections
o.hibernate.internal.util.EntityPrinter  : Listing entities:
o.hibernate.internal.util.EntityPrinter  : com.example.entity.Ticket{UserComments=[com.example.entity.Comment#component[id,ticket,user]{ticket=com.example.entity.Ticket#4, id=3, user=com.example.entity.User#8}], description=description, ticketUpdated=2015-11-10 15:51:23.0, id=4, ticketAdded=2015-11-10 09:05:53.0, UserTickets=<uninitialized>, priority=normal, title=title, status=new}
o.hibernate.internal.util.EntityPrinter  : com.example.entity.Comment{commentDate=2015-11-10 15:51:23.0, comment=newcommentg, pk=component[id,ticket,user]{ticket=com.example.entity.Ticket#4, id=3, user=com.example.entity.User#8}}
o.hibernate.internal.util.EntityPrinter  : com.example.entity.User{firstName=firstName, lastName=lastName, UserComments=<uninitialized>, password=password, id=8, UserTickets=<uninitialized>, login=login, status=active}
o.h.e.t.internal.jdbc.JdbcTransaction    : committed JDBC Connection
o.h.e.t.internal.jdbc.JdbcTransaction    : re-enabling autocommit
o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
o.h.e.j.internal.LogicalConnectionImpl   : Releasing JDBC connection
o.h.e.j.internal.LogicalConnectionImpl   : Released JDBC connection
o.s.web.servlet.DispatcherServlet        : Successfully completed request
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117727
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meph,

Ну, вот, теперь мы дошли до старых добрых Hibernate ORM граблей. Дело в том что у вас явно грузится коллекция комментариев. Поэтому нужно удалить коментарий из коллекции, а не коментарий по id.
В идеале код должен выглядеть так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	public void deleteComment(@PathVariable("ticketId") Long ticketId, @PathVariable("commentId") Long commentId) {
		Ticket ticket = ticketRepository.findOne(ticketId);
		if (ticket == null) {
			throw new NotFoundException(ticketId.toString() + "(Ticket)");
		}
                ticket.deleteComment(commentId);
        }

        public class Ticket extends AbstractPersistable<Long>{
                public boolean deleteComment(Long commentId){
                        this.UserComments.removeIf(c -> c.getPk().getId().equals(commentId));
                }
        }
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117737
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Код: java
1.
                        this.UserComments.removeIf(c -> c.getPk().getId().equals(commentId));


По-моему предикат как-то покрасивее можно оформить, но что-то под вечер уже не соображаю.
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117743
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Для начала пофиксить инкапсуляцию:
Код: java
1.
this.UserComments.removeIf(c -> c.hasId(commentId));
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117751
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Код: java
1.
2.
3.
                public boolean deleteComment(Long commentId){
                        return this.UserComments.removeIf(c -> c.hasId(commentId));
                }


return профтыкал.
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117767
meph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Спасибо еще раз за помощь. Значит придется удалять через коллекции, а не старым дедовским SQL подходом. Кажется мне нужно что-то почитать на эту тему, а то я уже поплыл на таком простом примере.

Я оставил ваш первый вариант с "c -> c.getPk().getId().equals(commentId)", а красивости потом можно навести. Тем не менее запись по-прежнему осталась в таблице. Сам вызов deleteComment отработал как надо, вернув true.

Нужно ли вызвать save() для ticket? Или проблема в том, что User ссылается на ту же самую коллекцию?



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Calling deleteComment() method...
stractLoadPlanBasedCollectionInitializer : Loading collection: [com.example.entity.Ticket.UserComments#4]
org.hibernate.SQL                        : select usercommen0_.id_ticket as id_ticke5_2_0_, usercommen0_.id as id1_1_0_, usercommen0_.id_ticket as id_ticke5_1_0_, usercommen0_.id_user as id_user4_1_0_, usercommen0_.id as id1_1_1_, usercommen0_.id_ticket as id_ticke5_1_1_, usercommen0_.id_user as id_user4_1_1_, usercommen0_.comment as comment2_1_1_, usercommen0_.comment_date as comment_3_1_1_, user1_.id as id1_3_2_, user1_.first_name as first_na2_3_2_, user1_.last_name as last_nam3_3_2_, user1_.login as login4_3_2_, user1_.password as password5_3_2_, user1_.status as status6_3_2_ from comments usercommen0_ left outer join users user1_ on usercommen0_.id_user=user1_.id where usercommen0_.id_ticket=?
Hibernate: select usercommen0_.id_ticket as id_ticke5_2_0_, usercommen0_.id as id1_1_0_, usercommen0_.id_ticket as id_ticke5_1_0_, usercommen0_.id_user as id_user4_1_0_, usercommen0_.id as id1_1_1_, usercommen0_.id_ticket as id_ticke5_1_1_, usercommen0_.id_user as id_user4_1_1_, usercommen0_.comment as comment2_1_1_, usercommen0_.comment_date as comment_3_1_1_, user1_.id as id1_3_2_, user1_.first_name as first_na2_3_2_, user1_.last_name as last_nam3_3_2_, user1_.login as login4_3_2_, user1_.password as password5_3_2_, user1_.status as status6_3_2_ from comments usercommen0_ left outer join users user1_ on usercommen0_.id_user=user1_.id where usercommen0_.id_ticket=?
o.h.l.p.e.p.i.ResultSetProcessorImpl     : Preparing collection intializer : [com.example.entity.Ticket.UserComments#4]
o.h.l.p.e.p.i.ResultSetProcessorImpl     : Starting ResultSet row #0
l.p.e.p.i.EntityReferenceInitializerImpl : On call to EntityIdentifierReaderImpl#resolve, EntityKey was already known; should only happen on root returns with an optional identifier specified
e.p.i.CollectionReferenceInitializerImpl : Found row of collection: [com.example.entity.Ticket.UserComments#4]
o.h.engine.internal.TwoPhaseLoad         : Resolving associations for [com.example.entity.User#8]
o.h.engine.internal.TwoPhaseLoad         : Done materializing entity [com.example.entity.User#8]
o.h.engine.internal.TwoPhaseLoad         : Resolving associations for [com.example.entity.Comment#component[id,ticket,user]{ticket=com.example.entity.Ticket#4, id=3, user=com.example.entity.User#8}]
o.h.engine.internal.TwoPhaseLoad         : Done materializing entity [com.example.entity.Comment#component[id,ticket,user]{ticket=com.example.entity.Ticket#4, id=3, user=com.example.entity.User#8}]
o.h.e.l.internal.CollectionLoadContext   : 1 collections were found in result set for role: com.example.entity.Ticket.UserComments
o.h.e.l.internal.CollectionLoadContext   : Collection fully initialized: [com.example.entity.Ticket.UserComments#4]
o.h.e.l.internal.CollectionLoadContext   : 1 collections initialized for role: com.example.entity.Ticket.UserComments
stractLoadPlanBasedCollectionInitializer : Done loading collection
true
o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
o.h.e.j.internal.LogicalConnectionImpl   : Releasing JDBC connection
o.h.e.j.internal.LogicalConnectionImpl   : Released JDBC connection
o.s.web.servlet.DispatcherServlet        : Successfully completed request
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117782
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Можно save вызвать. Но по идее, если метод контроллера пометить @Transactional тогда не нужно. Dirty check должен отработать и закомитить изменения.
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39117924
meph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потыкал еще пару раз через RestClient Plugin, так ничего и не удалялось.

Через полчаса Штирлиц вспомнил про отсутсвие orphanRemoval=true в @OneToMany аннотации, и все заработало.
...
Рейтинг: 0 / 0
[Hibernate] Many to Many - Delete record from Join Table by Id
    #39118008
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meph,

Странно. Этот флаг же должен действовать при удалении Ticket.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / [Hibernate] Many to Many - Delete record from Join Table by Id
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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