JPA加入列允许每个值

时间:2010-05-03 10:20:57

标签: java jpa orm database-relations

我正在测试JPA,在一个简单的案例中File / FileVersions表(Master / Details),与OneToMany关系,我有这个问题:在FileVersions表中,字段“file_id”(负责与File表的关系)接受每个值,而不仅仅是File表中的值。

如何使用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;

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

FILEVERSION CLASS

@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;

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

这是 FILEVERSION TABLE

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 个答案:

答案 0 :(得分:1)

感谢您的帮助,

我知道限制输入的SQL约束,但是可以使用一些注释创建这个SQL costraint,而无需手动编写数据库中的SQL吗?

我是JPA的新手,我在考虑使用@JoinColumn注释,JPA也可以创建成本...

再次感谢你。

答案 1 :(得分:0)

在Java级别,您描述和注释类之间的关联 - 您和您所做的 - 并且您的映射看起来很好。

在数据库级别,如果要将file_id列中的可能值限制为FILE表中的主键值,则应使用foreign key约束。为此,您需要使用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表。