Java JPA OrphanRemoving=true尝试更新而不是删除

Java JPA OrphanRemoving=true尝试更新而不是删除,java,hibernate,jpa,Java,Hibernate,Jpa,我有非常具体的情况,在从java集合中删除时尝试了不同的场景来实现从DB中删除 我有一个房间和一个房间和一个房间和一张床的关系。但是,房子和床之间也有一种关系: 众议院实体 public class HouHouse implements EntityInt, Serializable { @Id @Column(name = "id", nullable = false) @GeneratedValue(strategy = GenerationType.SEQUENC

我有非常具体的情况,在从java集合中删除时尝试了不同的场景来实现从DB中删除

我有一个房间和一个房间和一个房间和一张床的关系。但是,房子和床之间也有一种关系:

众议院实体

public class HouHouse implements EntityInt, Serializable {
    @Id
    @Column(name = "id", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HOU_HOUSES_SEQ")
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "house", cascade = CascadeType.ALL, orphanRemoval = true)
    @OrderBy("id")
    private List<HouRoom> rooms;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "id_house")
    @OrderBy("id")
    private List<HouBed> beds;
...
}
在这种情况下,当我尝试执行以下操作时:

room.getBeds().remove(bed);
entityManager.merge(room);
entityManager.flush();
我得到一个错误:

06:28:53,344 INFO  [stdout] (http-localhost/127.0.0.1:8080-4) Hibernate: 
06:28:53,344 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)     update
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)         public.HOU_BEDS 
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)     set
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)         ID_ROOM=null 
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)     where
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)         ID_ROOM=? 
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)         and id=?

06:28:53,346 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost/127.0.0.1:8080-4) SQL Error: 0, SQLState: 23502
06:28:53,346 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost/127.0.0.1:8080-4) Zadanie wsadowe 0 update public.HOU_BEDS set ID_ROOM=null where ID_ROOM='20' and id='32' zostało przerwane. Wywołaj getNextException by poznać przyczynę.
06:28:53,346 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost/127.0.0.1:8080-4) SQL Error: 0, SQLState: 23502
06:28:53,346 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost/127.0.0.1:8080-4) ERROR: null value in column "id_room" violates not-null constraint
06:28:53,346 ERROR [org.hibernate.engine.jdbc.batch.internal.BatchingBatch] (http-localhost/127.0.0.1:8080-4) HHH000315: Exception executing batch [could not perform addBatch]
06:28:53,346 INFO  [com.i4u.qla.action.house.HouRoomCrud] (http-localhost/127.0.0.1:8080-4) Start info here: ERROR: null value in column "id_room" violates not-null constraint
06:28:53,348 ERROR [stderr] (http-localhost/127.0.0.1:8080-4) javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
所以-jpa尝试更新NOTNULL字段,而不仅仅是删除行

第二种情况-如果我将房间实体和床的关系更改为双向,那么在尝试从beds集合中删除元素并合并房间后,它不会执行任何操作。Hibernate不会尝试删除或更新床:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="room")
@OrderBy("id")
private List<HouBed> beds;

如何管理它的工作?请帮忙。我花了很多时间尝试StackOverflow的任何解决方案,但在我的情况下找不到任何有帮助的解决方案。

不幸的是,当实体列表中的实体有多个父实体时,会出现某种冲突

在我的示例中,我甚至删除了孤儿移除标志,并尝试通过

移除实体管理器

也没有成功。JPA没有试图删除或更新它

所以最后我去掉了房子和床之间的一个女人的关系,只留下了房间和床之间的一个女人的关系,房子和房间之间的一个女人的关系——一切都开始起作用了——我知道,很抱歉

06:28:53,344 INFO  [stdout] (http-localhost/127.0.0.1:8080-4) Hibernate: 
06:28:53,344 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)     update
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)         public.HOU_BEDS 
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)     set
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)         ID_ROOM=null 
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)     where
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)         ID_ROOM=? 
06:28:53,345 INFO  [stdout] (http-localhost/127.0.0.1:8080-4)         and id=?

06:28:53,346 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost/127.0.0.1:8080-4) SQL Error: 0, SQLState: 23502
06:28:53,346 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost/127.0.0.1:8080-4) Zadanie wsadowe 0 update public.HOU_BEDS set ID_ROOM=null where ID_ROOM='20' and id='32' zostało przerwane. Wywołaj getNextException by poznać przyczynę.
06:28:53,346 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost/127.0.0.1:8080-4) SQL Error: 0, SQLState: 23502
06:28:53,346 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost/127.0.0.1:8080-4) ERROR: null value in column "id_room" violates not-null constraint
06:28:53,346 ERROR [org.hibernate.engine.jdbc.batch.internal.BatchingBatch] (http-localhost/127.0.0.1:8080-4) HHH000315: Exception executing batch [could not perform addBatch]
06:28:53,346 INFO  [com.i4u.qla.action.house.HouRoomCrud] (http-localhost/127.0.0.1:8080-4) Start info here: ERROR: null value in column "id_room" violates not-null constraint
06:28:53,348 ERROR [stderr] (http-localhost/127.0.0.1:8080-4) javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="room")
@OrderBy("id")
private List<HouBed> beds;