[hibernate-issues] [Hibernate-JIRA] Created: (HBX-1123) Reveng foreign-key map to non-primary key column produces incorrect mapping file
Michael Sabin (JIRA)
noreply at atlassian.com
Fri Apr 24 21:10:17 EDT 2009
Reveng foreign-key map to non-primary key column produces incorrect mapping file
--------------------------------------------------------------------------------
Key: HBX-1123
URL: http://opensource.atlassian.com/projects/hibernate/browse/HBX-1123
Project: Hibernate Tools
Issue Type: Bug
Affects Versions: 3.2.4 Beta1
Environment: Eclipse Platform
Version: 3.4.2
Build id: M20090211-1700
Hibernate Tools 3.2.4.GA-R200903141626-H5
Windows XP Pro SP3
JRE 6
Tested on Oracle 10g and Apache Derby
Reporter: Michael Sabin
Priority: Minor
Attachments: CodeGenCfg1.png, CodeGenCfg2.png
Creating a mapping from a column in one table to a non-primary key column in another table produces incorrect mapping file missing a property-ref to the non-primary key.
How to reproduce using Apache Derby:
Create a database and connect to the database.
jdbc:derby://localhost:1527/myDB;create=true;user=me;password=mine
Create these tables in the myDB database, in the ME schema.
create table vehicles (
make_id integer,
model_id integer,
name varchar(50),
PRIMARY KEY (make_id, model_id)
);
create table owners (
owner_id integer PRIMARY KEY,
favorite_make_id integer,
name varchar(20)
);
-- optional content
insert into vehicles values (1, 10, 'Chevrolet Corvette');
insert into vehicles values (2, 11, 'Ford Focus');
insert into vehicles values (3, 12, 'Honda Accord');
insert into vehicles values (4, 13, 'Toyota Camry');
insert into owners values (50, 3, 'Jim');
insert into owners values (51, 1, 'Alex');
insert into owners values (52, 4, 'Sue');
insert into owners values (53, 1, 'Casey');
Create this Hibernate Configuration file.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.apache.derby.jdbc.EmbeddedDriver</property>
<property name="hibernate.connection.url">jdbc:derby://localhost:1527/myDB</property>
<property name="hibernate.connection.username">me</property>
<property name="hibernate.connection.password">mine</property>
<property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.default_schema">ME</property>
<property name="hibernate.show_sql">true</property>
</session-factory>
</hibernate-configuration>
Setup a Hibernate Console Configuration with the configuration above and connection to the Derby database.
Create this Hibernate reverse engineering configuration
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >
<hibernate-reverse-engineering>
<table-filter match-name="OWNERS"/>
<table-filter match-name="VEHICLES"/>
<table name="VEHICLES">
<foreign-key foreign-table="OWNERS">
<column-ref local-column="MAKE_ID" foreign-column="FAVORITE_MAKE_ID" />
</foreign-key>
</table>
</hibernate-reverse-engineering>
Setup a Hibernate Code Generation configuration like in the attached images.
Running the Code Generation configuration will produce this Vehicles.hbm.xml mapping file.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="reveng.Vehicles" table="VEHICLES">
<composite-id name="id" class="reveng.VehiclesId">
<key-property name="makeId" type="int">
<column name="MAKE_ID" />
</key-property>
<key-property name="modelId" type="int">
<column name="MODEL_ID" />
</key-property>
</composite-id>
<many-to-one name="owners" class="reveng.Owners" update="false" insert="false" fetch="select">
<column name="MAKE_ID" not-null="true" />
</many-to-one>
<property name="name" type="string">
<column name="NAME" length="50" />
</property>
</class>
</hibernate-mapping>
The many-to-one tag should have this additional attribute: property-ref="favoriteMakeId"
--
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