Java ID变为“&引用;由CrudRepository执行时

Java ID变为“&引用;由CrudRepository执行时,java,hibernate,Java,Hibernate,我有两个实体: @Entity @Table(name="\"Group\"") public class Group implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private long id; @NotNull @ManyToOne(cascade=CascadeType.REMOVE

我有两个实体:

@Entity
@Table(name="\"Group\"")
public class Group implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private long id;

    @NotNull
    @ManyToOne(cascade=CascadeType.REMOVE, fetch=FetchType.EAGER)
    @JoinColumn(name="admin_id", referencedColumnName="id")
    private User admin;
    // .. other properties + setters and getters

}
-

当我删除一个组时,数据库中的所有组都会被删除。为什么会这样

这是我在日志中看到的内容(我的组表中的条目数与日志行数相同)


我确信我将正确的id传递给了组存储库的
.delete
方法。

默认情况下,Hibernate日志将参数显示为


只是猜测一下:你删除了一个组,它就删除了它的“管理员”,也就是说所有的组都被删除了。尝试删除
CascadeType。从代码中删除
。为什么要使用它?

您会在日志中看到
Hibernate:delete from
group
where id=?
,因为默认情况下Hibernate就是这样记录查询的。如果希望看到参数绑定到查询,请增加以下包的日志记录级别
log4j.logger.org.hibernate.type=trace

至于删除所有组的问题,这是由

@OneToMany(cascade = CascadeType.REMOVE, fetch=FetchType.EAGER, mappedBy="admin")
private Set<Group> ownedGroups;
删除组时,通过级联删除关联的用户,然后通过另一个级联调用删除所有关联的组


看起来
用户
实体是父实体,因为它可以有多个组,而组只能属于一个用户。删除用户组后,删除所有用户组是有意义的。因此,我建议离开CascadeType。仅在那里删除。

查看代码中的以下行:

@ManyToOne(cascade=CascadeType.REMOVE, fetch=FetchType.EAGER)
@JoinColumn(name="admin_id", referencedColumnName="id")
private User admin;
还有这些:

@OneToMany(cascade = CascadeType.REMOVE, fetch=FetchType.EAGER, mappedBy="admin")
private Set<Group> ownedGroups;
@OneToMany(cascade=CascadeType.REMOVE,fetch=FetchType.EAGER,mappedBy=“admin”)
私有集合拥有组;
从我看到的情况来看,我可以假设,当删除一个组时,您也会删除该组的管理员。因为你删除了管理员,你也删除了管理员拥有的所有组

发生这种情况是因为您使用的是
CascadeType。请以错误的方式删除
。删除组时,此注释会导致domino效果。您可以在这里阅读有关Hibernate中级联的内容


我建议您删除
CascadeType.remove
,因为它似乎不太适合您的域模型通常,当实体之间有很强的组合关系,而子实体没有父实体就没有任何意义时,这种类型的级联非常有用。例如公司和地址。如果删除公司,将其地址存储在数据库中是没有任何意义的。您的案例是实体的聚合,而不是组合。您的子实体(管理员)可以在没有父实体(组)的情况下存在。这同样适用于用户和拥有的组-如果您删除组的所有者,则删除所有拥有的组可能没有意义(例如,因为将来可能有人拥有它)。

但是为什么要调用
groupRepository.delete(id)
删除表中的所有项目?能否在hibernate配置中设置show_sql,并在执行删除操作时显示日志
hibernate:delete from
group`where id=?`我将断点放在代码上,并且我确定传入的组id不是
null
或格式不正确。是否在sql_日志中看到任何删除?例如,您在db和呼叫后groupRepository中有1000条组记录,这是正确的。删除id=1的(id)所有999条其他记录也将被删除???日志中的任何其他删除查询
@OneToMany(cascade = CascadeType.REMOVE, fetch=FetchType.EAGER, mappedBy="admin")
private Set<Group> ownedGroups;
@ManyToOne(cascade=CascadeType.REMOVE, fetch=FetchType.EAGER)
@JoinColumn(name="admin_id", referencedColumnName="id")
private User admin;
@ManyToOne(cascade=CascadeType.REMOVE, fetch=FetchType.EAGER)
@JoinColumn(name="admin_id", referencedColumnName="id")
private User admin;
@OneToMany(cascade = CascadeType.REMOVE, fetch=FetchType.EAGER, mappedBy="admin")
private Set<Group> ownedGroups;