代码之家  ›  专栏  ›  技术社区  ›  Maximetinu

JPA:我应该如何注释这些地图集?

  •  1
  • Maximetinu  · 技术社区  · 7 年前

    User File 编码如下:

    class User {
           List<File> ownFiles;
           Map<File, Integer> sharedFiles; 
    }
    
    class File {
           User author;
           Map<User, Integer> sharedUsers;
    }
    

    我试过了,但我总是 NotSerializableException “数据对于列来说太长”

    • 顺便说一句 文件 NotSerializableException 由于地图注释而引发。

    • 顺便说一下,这里有地图值的含义,

      • 使用者 ,文件的整数值表示用户对文件的权限级别
      • 在这种情况下 文件 文件

    P、 S:我在用Eclipselink

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jacek Cz    7 年前

    映射(<)&燃气轮机;无法由JPA 1.0处理 以这种方式(因此尝试序列化)

    JPA 2.0添加了注释,具有许多复杂的怪癖和微妙的属性 (个人意见) https://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/ElementCollections

    在我看来,使用JPA 1方式可以更好地控制数据库(对我来说更干净)。让我展示一下我的提议。

    class User {
         // ... fields waht You want
    }
    
    class FileEtiquette  {
           User author;
    }
    
    class SharingIncident {
      User user;
      FileEtiquette  file;
      int level;
    }
    

    也许我不完全理解你的命名法,所以名字可能不优雅。

    下一次尝试,未编译,仅示例。

        @Entity
        class User {
            @Id
            int id;
            @Basic
            Set<SharingIncident> shares;
            @Basic
            Set<FileEtiquette> myFiles;
             // ... fields waht You want
        }
    
    @Entity
    class FileEtiquette  {
        @Id
        int id;
        @Basic
        Set<SharingIncident> sharedBy;
        User author;
    }
    
    @Entity
    class SharingIncident {
        @Id
        int id;
        User user;
        FileEtiquette  file;
        int level;
    }
    

    几句话。

    • 手动。
    • 通常当普通程序员认为 List<> Set<> 可以 变得更好
    • 更改您的 File
    • 这是唯一的基础,许多可能的改进,基于我对您意图的理解。我的目标是展示如何替换地图<&燃气轮机;以经典的方式

    接下来可能的步骤,让我想一想

        2
  •  0
  •   Maximetinu    7 年前

    this tutorial 我用以下方式注释了字段:

    class User {
           @OneToMany
           List<File> ownFiles;
    
           @ElementCollection
           Map<File, Integer> sharedFiles; 
    }
    
    class File {
           @ManyToOne
           User author;
    
           @ElementCollection
           Map<User, Integer> sharedUsers;
    }
    

    更详细的信息:

    class User {
           @OneToMany
           @JoinTable(name = "USER_HAS__OWN_FILES", joinColumns = {
           @JoinColumn(name = "AUTHOR", referencedColumnName = "USERNAME")}, 
                inverseJoinColumns = {@JoinColumn(name = "OWN_FILE_ID", referencedColumnName = "ID") })
           List<File> ownFiles;
    
           @ElementCollection
           @CollectionTable(name = "USER_HAS_SHARED_FILES", joinColumns = 
           @JoinColumn(name = "USERNAME", referencedColumnName = "USERNAME"))
           @MapKeyJoinColumn(name = "SHARED_FILE_ID", referencedColumnName = "ID")
           @Column(name = "PERMISSION_LEVEL")
           Map<File, Integer> sharedFiles; 
    }
    
    class File {
           @ManyToOne
           @JoinColumn(name = "FILE_AUTHOR", referencedColumnName = "USERNAME")
           User author;
    
           @ElementCollection
           @CollectionTable(name = "FILE_HAS_BEEN_SHARED_TO_USER", 
               joinColumns = @JoinColumn(name = "FILE_ID", referencedColumnName = "ID"))
           @MapKeyJoinColumn(name = "USER_THAT_FILE_HAS_BEEN_SHARED_TO", referencedColumnName = "USERNAME")
           @Column(name = "PERMISSION_LEVEL")
           Map<User, Integer> sharedUsers;
    }
    

    现在它如我所料工作,生成了以下表格:

    • User (ID, Username, ...)
    • File (ID, Filename, Author, ...)
    • User_has_shared_files (Username, Shared_file_id, permission_level)
    • User_has__own_files (Username, Own_file_id)
    • File_has_been_shared_to_user (File_id, Username_id, permission_level)

    @ElementCollection 注释对映射很有用 Java.Map<Entity, basicType>