を考えてみましょう私は、次のようにフィールドを注釈されている:
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;
}
が今では、次のトンを生成し、私が期待どおりに動作ABLES:
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>
NotSerializableExceptionは、注釈を付けていないと、デフォルトのマッピングになり、オブジェクトをシリアライズしようとするからです。コレクションの使い方を教えてくれるわけではありません。コレクションの使い方、整数値の格納場所、格納場所などを教えてください。JPAチュートリアルManyToManyマッピング。 – Chris
おそらくエンジンは、このフィールドを「残酷な」非リレーショナルな方法(BLOB/CLOBなど)で保存したいので、直列化しようとします。オブジェクト・リレーショナルな方法でJPAにマップを格納することはできません。再設計を提案する、JPAでのプロジェクトは、古典的なOOPと必ずしも一致しないルールを維持しなければならない。つまり、マップは悪い。 –
は、ファイルに異なるクラス名を使用することをお勧めします –