Присоединенный столбец JPA позволяет каждое значение - PullRequest
0 голосов
/ 03 мая 2010

Я тестирую JPA, в простом случае таблицы File / FileVersions (Master / Details), с отношением OneToMany, у меня есть эта проблема: в таблице FileVersions поле "file_id" (отвечает за отношение с таблицей файлов) принимает все значения, а не только значения из таблицы файлов.

Как я могу использовать отображение JPA для ограничения ввода в FileVersion.file_id только для значений, существующих в File.id?

Мой класс File и FileVersion:

ФАЙЛ КЛАСС

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="FILE_ID")
private Long id;

@Column(name="NAME", nullable = false, length = 30)
private String name;

//RELATIONS -------------------------------------------

@OneToMany(mappedBy="file", fetch=FetchType.EAGER)
private Collection <FileVersion> fileVersionsList;

//-----------------------------------------------------

КЛАСС ПОЛОВИНЫ

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="VERSION_ID")
private Long id;

@Column(name="FILENAME", nullable = false, length = 255)
private String fileName;

@Column(name="NOTES", nullable = false, length = 200)
private String notes;

//RELATIONS -------------------------------------------

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="FILE_ID", referencedColumnName="FILE_ID", nullable=false)
private File file;

//-----------------------------------------------------

и это ТАБЛИЦА ФИЛЕВЕРСИИ

CREATE TABLE  `JPA-Support`.`FILEVERSION` (
`VERSION_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`FILENAME` varchar(255) NOT NULL,
`NOTES` varchar(200) NOT NULL,
`FILE_ID` bigint(20) NOT NULL,
PRIMARY KEY (`VERSION_ID`),
KEY `FK_FILEVERSION_FILE_ID` (`FILE_ID`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

Ответы [ 2 ]

1 голос
/ 05 мая 2010

Спасибо за помощь,

Я знаю ограничение SQL для ограничения входных данных, но можно создать эту оценку SQL с использованием некоторой аннотации, не записывая вручную SQL в базу данных?

Я новичок в JPA, я думал, что, используя аннотацию @JoinColumn, JPA может также создать калькуляцию ...

Спасибо еще раз.

0 голосов
/ 03 мая 2010

На уровне Java вы описываете и комментируете связи между классами - что и вы сделали - и ваше отображение выглядит хорошо.

На уровне базы данных, если вы хотите ограничить возможные значения в столбце file_id значениями, которые являются первичными ключами в таблице FILE, следует использовать ограничение внешний ключ . Для этого вам нужно будет использовать таблицы InnoDB. Примерно так:

CREATE TABLE  `JPA-Support`.`FILEVERSION` (
`VERSION_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`FILENAME` varchar(255) NOT NULL,
`NOTES` varchar(200) NOT NULL,
`FILE_ID` bigint(20) NOT NULL,
PRIMARY KEY (`VERSION_ID`),
FOREIGN KEY `FK_FILEVERSION_FILE_ID` (`FILE_ID`) REFERENCES FILE(ID)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

Таблица FILE также должна использовать InnoDB. На самом деле, используйте таблицы InnoDB для таблиц, для которых вы хотите использовать ссылочную целостность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...