当前位置: 首页 > 知识库问答 >
问题:

Spring-Hibernate多对多:保存实体,或在数据库中存在时创建关系

微生毅
2023-03-14

我是Spring和冬眠的新手,遇到了一个几天都解决不了的问题。

在我的项目中,我在服务器和用户实体之间使用多对多关系。一个用户可以存在于多个服务器上。

我的想法是:服务器

创建表的代码:

CREATE TABLE public.servers (
    id bigint NOT NULL,
    s_snowflake bigint NOT NULL,
    name character varying(64) NOT NULL
);

CREATE TABLE public.users (
    id bigint NOT NULL,
    u_snowflake bigint NOT NULL,
    name character varying(64) NOT NULL
);

CREATE TABLE public.server_users (
    id bigint NOT NULL,
    server_id bigint NOT NULL,
    user_id bigint NOT NULL
);

这是我的课程的样子:

@Entity
@Table(name = "servers")
public class Server {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "s_snowflake", unique = true)
    private long snowflake;

    private String name;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(
            name = "server_users",
            joinColumns = @JoinColumn(name = "server_id"),
            inverseJoinColumns = @JoinColumn(name = "user_id")
    )
    private Set<User> users = new HashSet<>();

}

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "u_snowflake", unique = true)
    private long snowflake;

    private String name;

    @ManyToMany(mappedBy = "users", targetEntity = Server.class, fetch = FetchType.EAGER)
    private Set<Server> servers = new HashSet<>();

}

当我初始化数据时,这很有效。我创建了一个服务器对象,并在其中填充了用户,所有内容都正确保存了。

但是当我试图保存一个包含已经在users表中的用户的服务器时,我遇到了问题(如果我从数据库中级联删除服务器,用户应该不会被删除)。

有没有办法配置Hibernate,以便在必要时添加新用户,但如果用户存在,则使用Server_Users表将其与新服务器“创建关系”?

我试着把卡斯特放进去。SAVE_UPDATE和其他方法,但没有结果。

上瘾:

这是我用来保存和更新的DAO类方法:

public abstract class AbstractDAOImpl<T> implements AbstractDAO<T> {
    public void save(T entity) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction trx = session.beginTransaction();
        session.save(entity);
        trx.commit();
        session.close();
    }
    public void update(T entity) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
        Transaction trx = session.beginTransaction();
        session.update(entity);
        trx.commit();
        session.close();
    }
}

服务器添加逻辑。首先,我将它保存到数据库中,然后用用户填充该集合,并执行< code>update()如果包含用户的表为空,则在Server_users和Users表中创建所有必要的记录和连接:

public static void addServer(Guild guild) {

        Server server = new Server(Long.parseLong(guild.getId()), guild.getName());
        serverDAO.save(server);

        for (Member m : guild.getMembers()) {
            User user = new User(Long.parseLong(m.getId()), m.getUser().getName());
            user.addServer(server);
            server.addUser(user);
        }

        serverDAO.update(server);

    }

共有1个答案

徐安康
2023-03-14

我找到了解决办法

    @Cascade({
            org.hibernate.annotations.CascadeType.SAVE_UPDATE,
            org.hibernate.annotations.CascadeType.MERGE,
            org.hibernate.annotations.CascadeType.PERSIST
    })
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "server_users",
            joinColumns = @JoinColumn(name = "server_sn"),
            inverseJoinColumns = @JoinColumn(name = "user_sn")
    )
    private Set<User> users = new HashSet<>();

我在服务器和用户代码SAVE_UPDATE添加了级联类型,合并和持久化

此外,我重新设计了基础的架构,将雪花作为主键,因为值始终是唯一的。

 类似资料:
  • 我是Hibernate的新手,并要求使用具有这些列的表的数据库 表:TBL _ product//库存项目列表< br >列:< br > key _ product < br > key _ category < br > fld _ product _ name < br > fld _ Inventory _ qty < br > fld _ unit _ price < br > fld

  • 我有一个实体CandidateTransaction和CandidateTransactionRepository扩展了CrudRepository 我正在使用CrudRepository的save方法来保存所述实体的对象。当实体没有行时,它将创建一个自动生成的键并将其插入ID列,而不需要Java端的干预。 而且,由于CrudRepository的save()方法检查实体是否是新的,如果是新的,它

  • 嗨,我有一个角色表和一个权限表,它有多对多的关系。我已经创建了下面链接中提到的实体 https://www.baeldung.com/jpa-多对多 角色实体 权限实体 我已经为每个实体创建了JPA存储库,并且正在尝试将权限保存给一个角色。我在表中已经有了一组/列表的权限,我正在尝试将它们映射到某个角色。我正在尝试使用spring JPA存储库执行下面的代码。 在执行我得到的代码时 org.hib

  • 我在用户和角色之间有多对多的关系 用户实体: 角色实体: 用户角色实体: 服务等级: 样本输入: 1:首次储蓄-成功 示例输入2:向同一用户保存其他角色-失败 异常:(尝试在链接实体中的用户和角色中插入null) 在用户实体的映射或实用方法中是否缺少某些内容。非常感谢您的帮助。

  • 问题内容: 我已经使用gps设备捕获了一个图的四个点(坐标)。 点1:-lat- 27.54798833长-80.16397166 点2:-lat 27.547766,长-80.16450166 点3:-lat 27.548131,长-80.164701 点4:---- 现在我想将这些坐标保存在oracle数据库中,并将其另存为多边形。 谢谢 问题答案: 如果打算使用Oracle Spatial来

  • 我正在尝试开发一个小型电子商务项目。我有一个篮子和篮子项目实体。我只是想当我为客户保存购物篮时,我想把购物篮项目保存在数据库中。我认为我不应该为篮子项目创建存储库。我应该能够保存篮子项目,同时使用篮子存储库保存篮子。 在这里,我试图通过篮子服务获得一个篮子项目,并将其设置为篮子实体并保存它。 我有什么问题?我有个例外。