How to Add a Foreign Key Constraint

Question

In our code, we have a USER table and a CONNECTIONS table
we need a foreign key in the CONNECTIONS table which should refer to the ID column in the USER table.

<Connection>
	<User id="Scott Tiger"/>
</Connection>
...
<User id="Scott Tiger">
	<login>scott</login>
	<password>tiger</password>
</User>

Issue: HJIII-86.

Answer

Associations are normally modelled in JPA with @OneToMany, @ManyToOne and so on. In the question above the requirement is actually not to model the association, but to simply add a foreign key constraint. To have something like:

alter table CONNECTION_TABLE
  add constaint FK1DB6BCCB5C8B695A
  foreign key (USER_ID) references USER_TABLE;

This has quite little to do with HJ3 or JPA since this foreign key does not exist in JPA entities, it's purely a database thing. If you still want this foreign key to be generated with JPA means, you can add a secondary table annotation to the entity which maps onto the referenced table.

Here's an example from ejb/tests/issues:

	<xsd:complexType name="issueHJIII86AType">
		<xsd:annotation>
			<xsd:appinfo>
				<hj:entity>
					<orm:secondary-table name="ISSUEHJIII86BTYPE">
						<orm:primary-key-join-column name="A_" referenced-column-name="ID"/>
					</orm:secondary-table>
				</hj:entity>
			</xsd:appinfo>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element name="login" type="xsd:string" minOccurs="0" />
			<xsd:element name="password" type="xsd:string" minOccurs="0" />
		</xsd:sequence>
		<xsd:attribute name="id" use="required" type="xsd:string">
			<xsd:annotation>
				<xsd:appinfo>
					<hj:id>
						<hj:generator generatorClass="assigned" />
					</hj:id>
				</xsd:appinfo>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>

	<xsd:complexType name="issueHJIII86BType">
		<xsd:sequence>
			<xsd:element name="A" type="xsd:string"/>
		</xsd:sequence>
		<xsd:attribute name="id" use="required" type="xsd:string">
			<xsd:annotation>
				<xsd:appinfo>
					<hj:id>
						<hj:generator generatorClass="assigned" />
					</hj:id>
				</xsd:appinfo>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>

Here's a sample XML:

	<issueHJIII86A id="issueHJIII86A[0]">
		<login>scott</login>
		<password>tiger</password>
	</issueHJIII86A>
	<issueHJIII86B id="issueHJIII86B[0]">
		<A>issueHJIII86A[0]</A>
	</issueHJIII86B>

In this example ISSUEHJIII86BTYPE has a foreign key referencing ISSUEHJIII86ATYPE. To achieve this, I've added a secondary table to the IssueHJIII86AType, referenced entity. The name of the secondary table matches the name of the table of the referencing entity. Primary key join column estabilishes a reference between the id column of the referenced entity (IssueHJIII86AType.Id) and the FK column of the referencing entity (IssueHJIII86BType.A). This results in a desired foreign key constraint:

alter table ISSUEHJIII86BTYPE 
        add constraint FK42DC84B0182F5598 
        foreign key (A_) 
        references ISSUEHJIII86ATYPE;
In order not to violate this constraint you'll have to make sure that your entities are persisted in the right order.

Browse Space

- Pages
- News
- Labels
- Attachments
- Bookmarks
- Mail
- Activity
- Advanced

Explore Confluence

- Popular Labels
- Notation Guide
- Impressum

Your Account

Log In

 

Other Features

Add Content