Affected openjpa release: 1.1.0 SVN source pull & build 2008-01-17
Affected product/subsystem: ReverseMappingTool
Severity: SEVERE Invalid source code is generated
Synopsis: Invalid code is generated when internally-generated foreign
key names are used and the ReverseMappingTool is run with the "-fk"
option set to true.
Description: If a constraint name is not explicitly defined, PostgreSQL
v7 synthesizes constraint names in the form "$n", where n is numeric,
viz:
Table "public.bus_stops"
Column | Type | Modifiers
-------------------+-----------------------+------------------------
stop_id | integer | not null
street1_name | character varying(32) | not null
street1_qualifier | character varying(11) |
street1_block | integer |
street2_name | character varying(32) |
street2_qualifier | character varying(11) |
street2_block | integer |
longitude | numeric(16,8) | not null default 0.0
latitude | numeric(16,8) | not null default 0.0
elevation | numeric(16,8) | not null default 0.0
description | text |
sheltered | boolean | not null default false
inbound | boolean | not null
street1_type | character varying(8) | not null
street2_type | character varying(8) | not null
street1_direction | character varying(5) | not null
street2_direction | character varying(5) | not null
Indexes:
"stop2_pkey" primary key, btree (stop_id)
Foreign-key constraints:
"$1" FOREIGN KEY (street1_direction) REFERENCES
lk_street_directions(street_direction_id)
"$2" FOREIGN KEY (street2_direction) REFERENCES
lk_street_directions(street_direction_id)
"fk_bus_stops_street1_type" FOREIGN KEY (street1_type) REFERENCES
lk_street_types(street_type_id)
"fk_bus_stops_street2_type" FOREIGN KEY (street2_type) REFERENCES
lk_street_types(street_type_id)
Consequences: Note the generated code for synthesized and explicit
constraint names:
/**
* Auto-generated by:
* org.apache.openjpa.jdbc.meta.ReverseMappingTool
$AnnotatedCodeGenerator
*/
@Entity
@Table(schema="public", name="bus_stops")
public class BusStops {
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
@JoinColumn(name="street1_direction", nullable=false)
private LkStreetDirections 1; //<==== WRONG
@OneToMany(targetEntity=com.mousetech.jta.persist.TripStops.class,
mappedBy="1", cascade=CascadeType.MERGE)
//VVVVV WRONG VVVV
private Set<TripStops> 1Inverses = new HashSet<TripStops>();
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
@JoinColumn(name="street2_direction", nullable=false)
private LkStreetDirections 2; //<==== WRONG
@OneToMany(targetEntity=com.mousetech.jta.persist.RouteStops.class,
mappedBy="2", cascade=CascadeType.MERGE)
//VVVVV WRONG VVVV
private Set<RouteStops> 22Inverses = new HashSet<RouteStops>();
@Basic
@Column(columnDefinition="text", length=2147483647)
private String description;
@Basic
private double elevation;
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
@JoinColumn(name="street1_type", nullable=false)
private LkStreetTypes fkBusStopsStreet1Type; //<==== CORRECT
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
@JoinColumn(name="street2_type", nullable=false)
private LkStreetTypes fkBusStopsStreet2Type; //<==== CORRECT
(remainder of code omitted as immaterial).