0

私は JPA をテストしています。単純なケースの File/FileVersions テーブル (Master/Details) で、OneToMany 関係があります。この問題があります。FileVersions テーブルでは、フィールド「file_id」(File テーブルとの関係を担当) がすべての値を受け入れます。 、ファイル テーブルの値だけではありません。

FileVersion.file_idJPA マッピングを使用して、に存在する値のみの入力を制限するにはどうすればよい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;

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

これが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
4

2 に答える 2

1

手伝ってくれてありがとう、

入力を制限するSQL制約を知っていますが、データベースにSQLを手動で書き込むことなく、注釈を使用してこのSQLコストレインを作成することは可能ですか?

私はJPAを初めて使用します。@JoinColumnアノテーションを使用すると、JPAはコストレインも作成できると考えていました...

ありがとうございました。

于 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 に答える