2017-02-06 12 views
1

Я пытаюсь создать отношения «многие-ко-многим» между классами User и FileObject с допущением, что пользователь может получить доступ ко многим объектам файлов, а к файловому объекту могут обращаться многие пользователи и одно- to-many, поскольку один пользователь может владеть множеством файлов, но один файл может принадлежать только одному пользователю. Вот мой код:JPA Многие из многих отношений создают две таблицы вхождения

@Entity 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    public int id; 
    public String firstname; 
    public String lastname; 
    public String publicAttributes; 
    public String privateAttributes; 

    @ManyToOne 
    private Department department; 

    @OneToMany(mappedBy = "user") 
    public List<Device> devices = new ArrayList<Device>(); 

    @OneToMany(mappedBy = "userCreator") 
    public List <FileObject> fileOwned = new ArrayList <FileObject>(); 

    @ManyToMany 
    @JoinTable(name="USER_FILE_ACCESS") 
    public List<FileObject> fileHasAccess = new ArrayList<FileObject>(); 
} 

@Entity 
public class FileObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    public int id; 
    String checksum; 

    @OneToMany(mappedBy = "fileObject") 
    public List<Policy> policies = new ArrayList<Policy>(); 

    byte[] encryptedFileKey; 

    byte[] iv; 

    @ManyToOne 
    public User userCreator; 

    @ManyToMany 
    public List<User> listUserAccessor = new ArrayList<User>(); 
} 

В теории он должен создать только один присоединиться таблицы, а именно USER_FILE_ACCESS, но когда я запускал скрипт, то он создает два объединения таблиц, и я не знаю, почему.

Вот выдержка из команд SQL:

show tables; 
+------------------+ 
| Tables_in_cpabe | 
+------------------+ 
| DEPARTMENT  | 
| DEVICE   | 
| FILEOBJECT  | 
| FILEOBJECT_USER | 
| POLICY   | 
| SEQUENCE   | 
| USER    | 
| USER_FILE_ACCESS | 
+------------------+ 

show columns from FILEOBJECT_USER; 
+---------------------+---------+------+-----+---------+-------+ 
| Field    | Type | Null | Key | Default | Extra | 
+---------------------+---------+------+-----+---------+-------+ 
| FileObject_ID  | int(11) | NO | PRI | NULL |  | 
| listUserAccessor_ID | int(11) | NO | PRI | NULL |  | 
+---------------------+---------+------+-----+---------+-------+ 

show columns from USER_FILE_ACCESS; 
+------------------+---------+------+-----+---------+-------+ 
| Field   | Type | Null | Key | Default | Extra | 
+------------------+---------+------+-----+---------+-------+ 
| User_ID   | int(11) | NO | PRI | NULL |  | 
| fileHasAccess_ID | int(11) | NO | PRI | NULL |  | 
+------------------+---------+------+-----+---------+-------+ 

Как сделать таблицу соединения быть только один стол?

+0

Ваш второй @ManyToMany не имеет таблицы соединений/отображен. возможно, посмотрите на него – XtremeBaumer

+0

@XtremeBaumer Я видел в некоторых примерах, доступных для другой стороны объединенной таблицы, мне не нужна эта аннотация CMIIW –

ответ

1

Если вы хотите иметь двунаправленную связь затем:

@Entity 
public class User { 

@ManyToMany 
@JoinTable(name="USER_FILE_ACCESS" 
    [email protected](name="user_id"), 
     [email protected](name="fileHasAccess_ID ")) 
public Set<FileObject> fileHasAccess; 


@Entity 
public class FileObject { 

@ManyToMany 
@JoinTable(name="USER_FILE_ACCESS" 
     [email protected](name="fileHasAccess_ID"), 
      [email protected](name="user_id")) 
    public Set<User> listUserAccessor; 

Update

Попробуйте использовать SEt вместо списка.

И вы также можете попробовать другой двунаправленный вариант. Так на не владеющей стороне вы бы карту следующим образом:

@ManyToMany(mappedBy = "fileHasAccess") 
public Set<User> listUserAccessor; 

удвоит Также проверьте имена столбцов .. я, возможно, придется поставить что-то другое то, что вы на самом деле ahve в БД.

+0

, она все еще не работает и вместо этого дала некоторую ошибку неизвестных таблиц, а также присоединила таблицу не существует –

+1

указание mappedBy делает его двунаправленным, а не однонаправленным. Если вы хотите использовать сопоставление, указанное на «другой» стороне, а не дублировать его, добавьте mappedBy – Chris

+0

Исправьте свой пример другого способа объявления его как двунаправленного. Мне кажется, мне нужен перерыв сегодня. –

 Смежные вопросы

  • Нет связанных вопросов^_^