]
João Francisco A. Enomoto commented on HHH-4235:
------------------------------------------------
Just found this bug as well here at work and would like to see it solved. Does anyone know
when it'll be solved?
MapBinder.createFormulatedValue() does not honor DB schema name when
creating query
-----------------------------------------------------------------------------------
Key: HHH-4235
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4235
Project: Hibernate Core
Issue Type: Bug
Components: annotations
Environment: Hibernate 3.3.0.SP1, PostgresQL 8.3
Reporter: Sven Panko
I detected a problem with a ManyToMany mapping using a Map in the following setup:
@Entity
@Table(name = "entitya", schema = "myschema")
class EntityA {
...
@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@MapKey(name = "identifier")
@JoinTable(name = "entitya_entityb", schema="myschema", joinColumns
= @JoinColumn(name = "entitya_pk"), inverseJoinColumns = @JoinColumn(name =
"entityb_pk"))
@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Map<String, EntityB> entityBMap = new HashMap<String, EntityB>();
}
@Entity
@Table(name = "entityb", schema = "myschema")
class EntityB {
...
}
The SQL generated to load the entityBMap collection contains a subquery in the select
clause, which looks like this:
select a8.identifier from entityb a8 where a8.pk=entityb0_.entityb_pk
(entityb0_.entityb_pk comes from the outer select clause)
The problem here is, that entityb in the from clause is not prepended by the schema name
"myschema" (the outer query is correctly doing this in the join clause,
however). I tracked this down to the createFormulatedValue() method in the MapBinder
class; the responsible code snippet is contained in lines 292 - 296:
StringBuilder fromAndWhereSb = new StringBuilder( " from " )
.append( associatedClass.getTable().getName() )
//.append(" as ") //Oracle doesn't support it in subqueries
.append( " " )
.append( alias ).append( " where " );
associatedClass.getTable().getName() does not return the fully qualified table name, so I
think this should look something like this:
StringBuilder fromAndWhereSb = new StringBuilder( " from " );
if (associatedClass.getTable().getSchema() != null) {
fromAndWhereSb.append(associatedClass.getTable().getSchema()).append('.');
}
fromAndWhereSb.append( associatedClass.getTable().getName() )
//.append(" as ") //Oracle doesn't support it in subqueries
.append( " " )
.append( alias ).append( " where " );
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: