0

我正在测试 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;

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

文件版本类

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

2 回答 2

1

感谢帮助,

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

我是 JPA 的新手,我在想使用 @JoinColumn 注释,JPA 也可以创建 costraint ...

再次感谢你。

于 2010-05-05T11:36:13.597 回答
0

在 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 表。

于 2010-05-03T10:34:33.517 回答