【问题标题】:how to add other columns to the joinTable in a Many To Many relationship in hibernate JPA?如何在休眠JPA中的多对多关系中将其他列添加到joinTable?
【发布时间】:2015-07-04 06:10:39
【问题描述】:

我有两个实体 User 和 File 。一个文件可以与许多用户共享,一个用户可以接收许多文件。所以这是两个实体之间的多对多关系。

在用户类中:

 @ManyToMany
        @JoinTable(name = "receiver_shared",
                joinColumns = @JoinColumn(name =  "user_id", 
                               insertable =false, updatable = false),
                inverseJoinColumns = @JoinColumn(name ="file_id",   
                                     insertable = false, updatable = false))
         private List<File> receivedfiles;

在 File 类中:

  @ManyToMany(mappedBy = "receivedfiles")
        private List<User> receivers;

我的问题是我想保存 shareTime 并在与用户共享文件时分配权限。我的意思是文件 1 可以与具有读写权限的用户 1 共享,并且可以与具有只读权限的用户 2 共享。

我是 JPA 的新手。我在想的是 receiver_shared 表必须包含一个权限列和 shareTime 列。

怎么做?

更新:

正如 JB Nizet 建议的那样,我创建了一个新的 Share 实体。

我已将此添加到我的文件类中

@OneToMany (mappedBy = "sharedFile",fetch=FetchType.LAZY)
    private List<Share> shares = new ArrayList<Share>();

我已将此添加到我的用户类中

@OneToMany (mappedBy = "receiver",fetch=FetchType.LAZY)
    private List<Share> receivedfiles = new ArrayList<Share>();

在我的 Share Class 中,我添加了一个列 shareTime 、一个列权限和:

@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "receiver_id")
    private User receiver;

@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "file_id")
    private File sharedFile;

我用 JUnit 测试了我的配置

User receiver=userRepository.findOne((long)2);
File toshare=fileRepository.findOne((long)2);
Share s=new Share(toshare,receiver,1,new Timestamp(newDate().getTime()));
shareRepository.save(s);

【问题讨论】:

    标签: database jpa many-to-many


    【解决方案1】:

    如果连接表包含额外的功能信息,它就不再是连接表了,它必须被映射为一个实体。

    因此,您将在 User 和 Share 之间建立一对多,在 File 和 Share 之间建立一对多。

    【讨论】:

    • 当我尝试保存新共享时,我收到此错误,org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passing to persist:entities.User;检查我的更新
    • 从您的 ManyToOne 中删除 cascade = ALL。那没有意义。您不希望在删除文件时从数据库中删除用户和文件。您还应该在单个事务中完成您的工作,而不是使用 3 个不同的事务。
    • 非常感谢,抱歉我的问题是因为我正在自学
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2015-12-22
    相关资源
    最近更新 更多