[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