[hibernate-issues] [Hibernate-JIRA] Moved: (ANN-704) Allow expression in a @JoinColumn for a composite foreign key

Darren Bell (JIRA) noreply at atlassian.com
Fri Mar 7 06:09:32 EST 2008


     [ http://opensource.atlassian.com/projects/hibernate/browse/ANN-704?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Darren Bell moved HHH-2996 to ANN-704:
--------------------------------------

    Affects Version/s:     (was: 3.2.5)
                       3.3.0.ga
                  Key: ANN-704  (was: HHH-2996)
              Project: Hibernate Annotations  (was: Hibernate3)

> Allow expression in a @JoinColumn for a composite foreign key
> -------------------------------------------------------------
>
>                 Key: ANN-704
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/ANN-704
>             Project: Hibernate Annotations
>          Issue Type: New Feature
>    Affects Versions: 3.3.0.ga
>         Environment: hibernate 3.2.5, db2/400 v5r4
>            Reporter: Darren Bell
>
> I am mapping our Mapics COM history with hibernate and have been pretty successful so far, but have hit a stumbling block.
> There is a table in Mapics that stores history comments for many different other tables, hence each table has a different foreign key.
> The table is outlined below for those that don't know Mapics ;)
> 	COL_NO	NAME	COL_TYPE	LENGTH	DP	NULL	DFT	DEFAULT	DESCRIPTION
> 	1	GAAENB	NUMERIC	2	0	N	Y	0	Company number
> 	2	GAGGNB	NUMERIC	6	0	N	Y	0	Invoice number
> 	3	GAHYNB	DECIMAL	7	0	N	Y	0	Invoice sequence
> 	4	GAKBNB	DECIMAL	5	0	N	Y	0	Comment line sequence number
> 	5	GAAKCD	CHAR	3		N	Y	' '	Language code
> 	6	GAAAD9	CHAR	1		N	Y	' '	Internal print only?
> 	7	GAHDTX	CHAR	25		N	Y	' '	Comment line text
> 	8	GAHXCD	CHAR	5		N	Y	' '	Comment user reference
> 	9	GADCCD	CHAR	1		N	Y	' '	Internal header type
> 	10	GACVNB	CHAR	7		N	Y	' '	Quote/order number
> 	11	GAK4NB	DECIMAL	7	0	N	Y	0	Shipment header number
> 	12	GAAFAD	DECIMAL	3	0	N	Y	0	Shipment consolidate seq
> 	13	GALCNB	DECIMAL	7	0	N	Y	0	Ship release sequence
> 	14	GAAASZ	DECIMAL	5	0	N	Y	0	Kit release sequence
> 	15	GAAAD2	DECIMAL	7	0	N	Y	0	Special charge sequence #
> 	16	GAAD1N	CHAR	1		N	Y	' '	Text line print control
> To get the comments from the shipment release we use the following:
> 	@OneToMany()
> 	@JoinColumns ({
> 		@JoinColumn(name=HistoricalComment.Columns.COMPANY_NUMBER, referencedColumnName=ShipRelease.Columns.COMPANY_NUMBER),
> 		@JoinColumn(name=HistoricalComment.Columns.INTERNAL_HEADER_TYPE, referencedColumnName=ShipRelease.Columns.INTERNAL_HEADER_TYPE),
> 		@JoinColumn(name=HistoricalComment.Columns.ORDER_NUMBER, referencedColumnName=ShipRelease.Columns.ORDER_NUMBER),
> 		@JoinColumn(name=HistoricalComment.Columns.SHIPMENT_HEADER_NUMBER, referencedColumnName=ShipRelease.Columns.SHIPMENT_HEADER_NUMBER),
> 		@JoinColumn(name=HistoricalComment.Columns.SHIP_RELEASE_SEQUENCE, referencedColumnName=ShipRelease.Columns.SHIP_RELEASE_SEQUENCE),
> 		@JoinColumn(name=HistoricalComment.Columns.KIT_RELEASE_SEQUENCE, referencedColumnName=ShipRelease.Columns.KIT_RELEASE_SEQUENCE)
> 	})
> 	@Sort(type=SortType.NATURAL)
> 	private SortedSet<HistoricalComment> historicalComments;
> Which works well, but to the the comments for the ship header the following is needed
> 	@OneToMany()
> 	@JoinColumns ({
> 		@JoinColumn(name=HistoricalComment.Columns.COMPANY_NUMBER, referencedColumnName=ShipHeader.Columns.COMPANY_NUMBER),
> 		@JoinColumn(name=HistoricalComment.Columns.INTERNAL_HEADER_TYPE, referencedColumnName=ShipHeader.Columns.INTERNAL_HEADER_TYPE),
> 		@JoinColumn(name=HistoricalComment.Columns.ORDER_NUMBER, referencedColumnName=ShipHeader.Columns.ORDER_NUMBER),
> 		@JoinColumn(name=HistoricalComment.Columns.SHIPMENT_HEADER_NUMBER, referencedColumnName=ShipHeader.Columns.SHIPMENT_HEADER_NUMBER)
> 	})
> 	@Sort(type=SortType.NATURAL)
> 	private SortedSet<HistoricalComment> historicalComments;
> As you can see there are two keys missing on the second one to many.  This has the undesired effect of retriving all the comments for the entire shipment, whether they are related to a relase, the header itself, or charge codes.
> Now, what i'm suggesting is to allow an expression for one of the join colums.  The following would solve the problem.
> @OneToMany()
> 	@JoinColumns ({
> 		@JoinColumn(name=HistoricalComment.Columns.COMPANY_NUMBER, referencedColumnName=ShipRelease.Columns.COMPANY_NUMBER),
> 		@JoinColumn(name=HistoricalComment.Columns.INTERNAL_HEADER_TYPE, referencedColumnName=ShipRelease.Columns.INTERNAL_HEADER_TYPE),
> 		@JoinColumn(name=HistoricalComment.Columns.ORDER_NUMBER, referencedColumnName=ShipRelease.Columns.ORDER_NUMBER),
> 		@JoinColumn(name=HistoricalComment.Columns.SHIPMENT_HEADER_NUMBER, referencedColumnName=ShipRelease.Columns.SHIPMENT_HEADER_NUMBER),
> 		@JoinColumn(name=HistoricalComment.Columns.SHIP_RELEASE_SEQUENCE, expression=":shipReleaseSequence > 0"),
> 		@JoinColumn(name=HistoricalComment.Columns.KIT_RELEASE_SEQUENCE, expression=":kitReleaseSequence = 0")
> 	})
> This would put the expressions into the join clause.
> What do you think?  Have i explained this well enough?

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list