JPA单向多个无法删除

JPA单向多个无法删除,jpa,many-to-many,eclipselink,glassfish-4,Jpa,Many To Many,Eclipselink,Glassfish 4,我正在使用EclipseLink 2.6.1开发一个运行在GlassFish 4.1.1上的web应用程序。我在用户和项目之间有单向的多个关系,当我从User.Projects中删除元素并合并用户时,连接行不会在数据库中删除。我制作了一个较小的演示应用程序来隔离它: 用户类别: @Entity @Table(name = "demouser") public class DemoUser implements Serializable { @Id @GeneratedValue(

我正在使用EclipseLink 2.6.1开发一个运行在GlassFish 4.1.1上的web应用程序。我在用户和项目之间有单向的多个关系,当我从User.Projects中删除元素并合并用户时,连接行不会在数据库中删除。我制作了一个较小的演示应用程序来隔离它:

用户类别:

@Entity
@Table(name = "demouser")
public class DemoUser implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DemoUserSeq")
    @SequenceGenerator(name = "DemoUserSeq", sequenceName = "demouser_userid_seq", allocationSize = 1)
    @Column(name = "userid")
    private Integer id;
    @Column(name = "username")
    private String userName;
    // some more fields
    @JoinTable(name = "demouserprojbind", joinColumns = {
        @JoinColumn(name = "username", referencedColumnName = "username")
    }, inverseJoinColumns = {
        @JoinColumn(name = "projcode", referencedColumnName = "projcode")
    })
    @ManyToMany
    private Set<DemoProject> projects;
它显然无法输入所属实体的用户名-SQL不匹配任何行,因此不会从数据库中删除任何行

在我的保存逻辑中是否有任何错误(我想删除用户和项目之间的绑定,但用户和项目本身都应该保留),或者这是EcliseLink中的错误?

@ManyToMany
private Set<DemoProject> projects;
@manytomy
私人项目;
在anotation中输入许多级联类型,如下所示:

DELETE FROM demouserprojbind WHERE ((projcode = ?) AND (username = ?))
bind => [Project2, null]
DELETE FROM demouserprojbind WHERE ((projcode = ?) AND (username = ?))
bind => [Project1, null]
@ManyToMany(cascade={CascadeType.MERGE, CascadeType.REMOVE })
private Set<DemoProject> projects;
@ManyToMany(cascade={CascadeType.MERGE,CascadeType.REMOVE})
私人项目;

这是唯一不起作用的东西吗?您对映射或实体上的事件有任何自定义设置吗?JPA不允许在关系中使用非pk字段,虽然大多数提供商都支持它(EclipseLink允许),但它确实会导致缓存等问题,并且通常会导致警告。验证没有触发某些事件来设置userName=null,或者您没有以某种方式修改只读实例,以使对该用户名的查询从缓存返回损坏的实体。我的演示代码实际具有“(cascade=CascadeType.ALL)”,并设置为(cascade={CascadeType.MERGE,CascadeType.REMOVE})没有改善情况。
@ManyToMany(cascade={CascadeType.MERGE, CascadeType.REMOVE })
private Set<DemoProject> projects;