Issue Details (XML | Word | Printable)

Key: HBX-1123
Type: Bug Bug
Status: Open Open
Priority: Minor Minor
Assignee: Unassigned
Reporter: Michael Sabin
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Hibernate Tools

Reveng foreign-key map to non-primary key column produces incorrect mapping file

Created: 24/Apr/09 08:08 PM   Updated: 24/Apr/09 08:08 PM
Component/s: None
Affects Version/s: 3.2.4 Beta1
Fix Version/s: None

Time Tracking:
Not Specified

File Attachments: None
Image Attachments:

1. CodeGenCfg1.png
(32 kB)

2. CodeGenCfg2.png
(35 kB)
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

Bug Testcase Reminder (view):
REMINDER: Bug reports should generally be accompanied by a test case
Participants: Michael Sabin


 Description  « Hide

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"



There are no comments yet on this issue.