Java Hibernate:OneToMany/manytone与额外列级联

Java Hibernate:OneToMany/manytone与额外列级联,java,hibernate,Java,Hibernate,让我们举一个简单且众所周知的例子:用户和组 一个用户可以在多个组中,因为一个组可以有多个用户。但在本例中,我们希望处理,例如,用户进入组的日期 因此,我们将: 表格用户: @Entity public class User extends com.example.UserItf { public User() { /* not needed */ } @Id @GeneratedValue(strategy=GenerationType.SEQUENCE) @

让我们举一个简单且众所周知的例子:用户和组

一个用户可以在多个组中,因为一个组可以有多个用户。但在本例中,我们希望处理,例如,用户进入组的日期

因此,我们将:

表格用户:

@Entity
public class User extends com.example.UserItf {

    public User() { /* not needed */ }

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Override
    public Long getId(){
        return _id;
    }

    /* some other fields like name, etc. */

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
    @OrderBy("id")
    @Override
    public List<Group> getGroups(){
        return _groups;
    }
}
表组包括:

@Entity
public class Group extends com.example.GroupItf {

    public Group() { /* not needed */ }

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Override
    public Long getId(){
        return _id;
    }

    /* some other fields like name, etc. */

    @OneToMany(mappedBy = "group", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
    @OrderBy("id")
    @Override
    public List<User> getUsers(){
        return _users;
    }
}
而且,令人惊讶的是,在启用日志输出后,我发现没有用于删除的输出。是否有可能实体管理者认为该实体没有改变

持久化用户的函数执行以下操作:

_entityManager.getTransaction().begin();
_entityManager.persist( user );
_entityManager.getTransaction().commit();
另外,多亏了@Dragan Bozanovic,这个场景似乎不适合这个问题。在这里,没有变化,没有移动,用户组链接也是如此

是否可以仅从用户端删除链接 示例,并将其级联以删除UserGroups关系?还是我 是否必须单独管理每个实体

可以满足此要求,但看起来您需要更新一些代码和映射


请浏览以下链接,我认为它应该有助于满足您的要求。

只是为了突出一点我的问题(这可能会挽救其他人的生命),我的问题只是一个编码问题

我在代码中看到,在一个实体中,我使用Hibernate的级联类型,而在另一个实体中,我使用Java的级联类型

// This is the cascade provided by javax.persistence.CascadeType
@OneToMany(mappedBy = "group", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
@OrderBy("id")
@Override
public List<User> getUsers(){
    return _users;
}
//这是javax.persistence.CascadeType提供的级联
@OneToMany(mappedBy=“group”,fetch=FetchType.LAZY,cascade={CascadeType.ALL})
@订购人(“id”)
@凌驾
公共列表getUsers(){
返回用户;
}
VS

//这是org.hibernate.annotations提供的级联
@OneToMany(mappedBy=“group”,fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@订购人(“id”)
@凌驾
公共列表getUsers(){
返回用户;
}

当然,我的问题很明显是我对这些方面缺乏了解,因此这可能是对其他人的一个提示。

您可以将代码发布到要删除组的位置吗?这只是一个示例,但代码将是
user.getGroups.remove(grp)
,其中
grp
是所选组。这就是你想要的吗?事实上,我不想删除一个组。在我的情况下,假设我只管理用户:组是数据库中的常量。所以我只想给一个用户添加一个组或者删除它,别的什么都不想。好吧,你的例子并没有反映你所描述的。实施这些示例,尝试它们,然后发布它们来描述您观察到的内容。另外,启用并发布执行的SQL。@DraganBozanovic请参见编辑。我对Hibernate不是很熟悉,如果缺少什么,请告诉我。感谢您的回答@MadhusudanaReddySunnapu,但在您的示例中,他们使用联接表执行保存或删除等操作。我想知道我是否只能从用户表(例如,获取一个用户和一个组,创建一个用户组,将该用户组添加到用户,并仅持久化该用户)执行此操作。如果我错了,请更正我,但在您的示例中,如果您删除一个用户组,它也会删除该用户和组,因为CascadeType.ALL,这是不需要的。@Jacks在我测试时,删除并没有导致删除用户和组实体。它只删除关系。关于只持久化用户对象,我怀疑这种映射是否可行。这很奇怪。。。我不知道为什么我会有这种行为,但我会做进一步的测试,也许我会发现问题。我将把你的答案作为目前公认的答案,因为你提供的链接适合我的情况。非常感谢。
_entityManager.getTransaction().begin();
_entityManager.persist( user );
_entityManager.getTransaction().commit();
// This is the cascade provided by javax.persistence.CascadeType
@OneToMany(mappedBy = "group", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
@OrderBy("id")
@Override
public List<User> getUsers(){
    return _users;
}
// This is the cascade provided by org.hibernate.annotations
@OneToMany(mappedBy = "group", fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@OrderBy("id")
@Override
public List<User> getUsers(){
    return _users;
}