[Hibernate-JIRA] Created: (HHH-3345) "select new" + "join fetch" = "owner of the fetched association was not present in the select list"
by Anthony Ogier (JIRA)
"select new" + "join fetch" = "owner of the fetched association was not present in the select list"
---------------------------------------------------------------------------------------------------
Key: HHH-3345
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3345
Project: Hibernate3
Issue Type: Bug
Affects Versions: 3.2.4.sp1
Reporter: Anthony Ogier
I want to create a List<B>, each B containing an entity with "A" type, and I also want for each A to force fetching of its "C" property.
public class B {
private A a;
public B(A a) {
this.a = a;
}
}
@Entity
public class A {
@ManyToOne @JoinColumn
private C c;
// +get/setter ...
}
@Entity
public class C {
@Column
private String d;
// +get/setter ...
// +@OneToMany
}
Here is the HQL :
select new B(a) from A a left join fetch a.c
I have that message :
org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
When invoking only "from A a left join fetch a.c", all is good and I have ma List<A> with its "C" properties fetched.
I think there is a little bug here ... or did I forget something ?
--
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....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years
[Hibernate-JIRA] Created: (HHH-4897) onFlushDirty not called if only modification was to a collection of elements
by Rob West (JIRA)
onFlushDirty not called if only modification was to a collection of elements
----------------------------------------------------------------------------
Key: HHH-4897
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4897
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 3.3.2, 3.3.1
Reporter: Rob West
Attachments: InterceptorTest.jar
We are not seeing onFlushDirty get called if the only modification to a Hibernate-mapped entity is to a collection of elements (e.g. a Set<String> that maps to entries in a related table). It appears that for purposes of calling onFlushDirty, a collection property of an entity can only be considered dirty if that entity is versioned (it may still not be dirty, but it cannot be dirty unless the entity is versioned). For purposes of actually executing SQL, the collection property is properly considered to be dirty based on a call to PersistentCollection.isDirty(), but this prevents an interceptor from acting on the modifications.
I've attached a jar file that contains (source) modifications to the InterceptorTest to add an additional test case highlighting this, along with modifications to User.java and User.hbm.xml to add an additional collection of elements property. The assertNotNull on line 66 (the check of last updated) fails for me locally with the latest hibernate source downloaded from hibernate.org, which appears to be 3.3.2. We currently use 3.3.1 in production.
My original forum post is at https://forum.hibernate.org/viewtopic.php?f=1&t=1002411, which contains some additional debugging information while I was figuring out what was going on.
As a note: I left the priority here the default. This is a pretty serious issue for us though, as one of the key things we do with interceptors is auditing of changes, and this means that sometimes certain properties do not get audited. We haven't been able to identify any straightforward workaround to implement that is not either fairly invasive or leaves us open to introducing other equally or more serious bugs in our code. Suggestions welcome.
--
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....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years
[Hibernate-JIRA] Created: (ANN-783) DOCS: says, monkey, should say tiger: section 2.2.5.3.2.4. Defaults
by Karl Palsson (JIRA)
DOCS: says, monkey, should say tiger: section 2.2.5.3.2.4. Defaults
-------------------------------------------------------------------
Key: ANN-783
URL: http://opensource.atlassian.com/projects/hibernate/browse/ANN-783
Project: Hibernate Annotations
Issue Type: Improvement
Components: documentation
Affects Versions: 3.4.0.GA
Environment: http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/
or
http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.ht...
Reporter: Karl Palsson
Priority: Trivial
Text says:
Trainer describes a unidirectional relationship with Tiger using the join table Trainer_Tiger, with a foreign key trainer_id to Trainer (table name, _, trainer id) and a foreign key trainedTigers_id to Monkey (property name, _, Tiger primary column).
Last reference to Monkey should say Tiger. Monkeys were used in the previous section
--
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....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years
[Hibernate-JIRA] Created: (HHH-5792) Unable to JOIN embedded objects in Criteria API
by scLee (JIRA)
Unable to JOIN embedded objects in Criteria API
-----------------------------------------------
Key: HHH-5792
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5792
Project: Hibernate Core
Issue Type: Bug
Components: entity-manager, query-criteria
Affects Versions: 3.6.0
Reporter: scLee
Priority: Blocker
Attachments: Client.java, CriteriaApiTest.java, Name.java
Exception is thrown when trying to JOIN embedded attribute in Criteria API. E.g. having the following entity:
{quote}
@Entity
public class Client implements Serializable {
@Id
public int id;
@Embedded
public Name name;
}
@Embeddable
public class Name implements Serializable {
@Column
public String firstName;
@Column
public String lastName;
}
{quote}
The following code
{quote}
CriteriaQuery< Client > cq = cb.createQuery( Client.class );
Root< Client > root = cq.from( Client.class );
cq.where( cb.equal( root.*join*( "name" ).get( "firstName" ), "foo" ) );
{quote}
throws this exception:
{quote}
java.lang.ClassCastException: org.hibernate.ejb.metamodel.SingularAttributeImpl cannot be cast to javax.persistence.metamodel.ManagedType
at org.hibernate.ejb.criteria.path.AbstractFromImpl.locateManagedType(AbstractFromImpl.java:151)
at org.hibernate.ejb.criteria.path.AbstractFromImpl.locateAttributeInternal(AbstractFromImpl.java:145)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:216)
at org.hibernate.ejb.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:449)
at org.hibernate.ejb.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:433)
at foo.CriteriaApiTest.embeddableInPath(CriteriaApiTest.java:45)
{quote}
--
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....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years
[Hibernate-JIRA] Created: (HHH-2796) Generated version are incremented by Hibernate
by Heba Tawfik (JIRA)
Generated version are incremented by Hibernate
----------------------------------------------
Key: HHH-2796
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2796
Project: Hibernate3
Issue Type: Bug
Components: core
Affects Versions: 3.2.1
Environment: 3.2.1, Oracle 10g
Reporter: Heba Tawfik
Creating a new entity which it's version is set to generated="always" & saving it, then in the same session adding an object to any of its on-to-many relationships is throwing a StaleObjectStateException.
To regenerate the problem, consider the following code
1- departement.hbm.xml :
----------------------------------------
<hibernate-mapping package="com.myproject.domain">
<class name="Departement" table="Departement">
<id name="id">
<column name="dept_id" />
</id>
<version column="version" generated="always" name="version" type="integer" unsaved-value="null" />
<property name="name" column="name" />
<bag name="employees" inverse="true" cascade="all" lazy="true">
<key column="dept_id"></key>
<one-to-many class="Employee" />
</bag>
</class>
</hibernate-mapping>
2- employee.hbm.xml :
--------------------------------------
<hibernate-mapping package="com.myproject.domain">
<class name="Employee" table="Employee">
<id name="id">
<column name="employee_id" />
</id>
<property name="firstName" column="first_name" />
<property name="lastName" column="last_name" />
<property name="age" column="age" />
<property name="salary" column="salary" />
<many-to-one cascade="none"
class="com.myproject.domain.Departement"
column="dept_id" embed-xml="true" insert="false"
name="department" not-null="false"
unique="false" update="false" not-found="ignore">
</many-to-one>
</class>
</hibernate-mapping>
3- Departement.Java
---------------------------
package com.myproject.domain;
import java.util.ArrayList;
import java.util.List;
public class Departement extends BaseDepartement{
int id;
String name;
List employees;
Integer version;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public List getEmployees() {
return employees;
}
public void setEmployees(List employees) {
this.employees = employees;
}
public void addToEmployeeList(Employee emp)
{
if(employees==null)
{
setEmployees(new ArrayList());
}
employees.add(emp);
}
}
4- Employee.Java :
---------------------------
package com.myproject.domain;
public class Employee {
int id;
String firstName;
String lastName;
int age;
int salary;
BaseDepartement department;
public BaseDepartement getDepartment() {
return department;
}
public void setDepartment(BaseDepartement department) {
this.department = department;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
4- Code To Test :
------------------------
public static void main(String args[]) throws Exception
{
SessionFactory factory = new Configuration().configure("com/myproject/config/hibernate.cfg.xml").buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
Departement aDept =new Departement();
aDept.setId(10);
aDept.setName("Test");
session.save(aDept);
transaction.commit();
transaction = session.beginTransaction();
Employee emp=new Employee();
emp.setId(10);
emp.setFirstName("test");
emp.setLastName("test");
emp.setSalary(10);
emp.setAge(10);
emp.setDepartment(aDept);
aDept.addToEmployeeList(emp);
session.saveOrUpdate(aDept);
transaction.commit();
session.close();
}
On the database, the default value for version cloumn is set to "1" and a trigger is defined as follow on the Departement table:
create or replace
TRIGGER TRIGGER1
BEFORE UPDATE ON DEPARTEMENT
FOR EACH ROW
BEGIN
:new.version:= :old.version + 1;
END;
Upon executing the above code, the following is the hibernate logging :
automatically flushing session
/* insert com.eds.myproject.domain.Departement
*/ insert
into
Departement
(name, dept_id)
values
(?, ?)
binding 'Test' to parameter: 1
binding '10' to parameter: 2
/* get generated state com.eds.myproject.domain.Departement */ select
departemen_.version as version1_
from
Departement departemen_
where
departemen_.dept_id=?
binding '10' to parameter: 1
returning '1' as column: version1_
before transaction completion
after transaction completion
automatically flushing session
/* get current state com.eds.myproject.domain.Employee */ select
employee_.employee_id,
employee_.first_name as first2_0_,
employee_.last_name as last3_0_,
employee_.age as age0_,
employee_.salary as salary0_
from
Employee employee_
where
employee_.employee_id=?
binding '10' to parameter: 1
/* insert com.eds.myproject.domain.Employee
*/ insert
into
Employee
(first_name, last_name, age, salary, employee_id)
values
(?, ?, ?, ?, ?)
binding 'test' to parameter: 1
binding 'test' to parameter: 2
binding '10' to parameter: 3
binding '10' to parameter: 4
binding '10' to parameter: 5
/* update
com.eds.myproject.domain.Departement */ update
Departement
set
name=?
where
dept_id=?
and version=?
binding 'Test' to parameter: 1
binding '10' to parameter: 2
binding '2' to parameter: 3
Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.eds.myproject.domain.Departement#10]
at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1714)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2357)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2257)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2557)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at com.eds.myproject.test.Test.main(Test.java:43)
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.eds.myproject.domain.Departement#10]
at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1714)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2357)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2257)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2557)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at com.eds.myproject.test.Test.main(Test.java:43)
--
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....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years
[Hibernate-JIRA] Created: (HHH-2776) Restrictons.in(..) generates invalid SQL if list of values is empty
by Adrian Smith (JIRA)
Restrictons.in(..) generates invalid SQL if list of values is empty
-------------------------------------------------------------------
Key: HHH-2776
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2776
Project: Hibernate3
Issue Type: Bug
Components: query-criteria
Affects Versions: 3.2.2
Environment: Hibernate 3.2.2.ga, MySQL 4.1.18, Windows XP
Reporter: Adrian Smith
I have classes called A and B. There is a 1:n relationship from A to B.
Class B has the following in its mapping file:
<many-to-one name="a" class="A" column="fk_a_id" not-null="true" />
If I write the following code:
List<B> foo() {
List<A> aList = ....
Session session = ....
Criteria query = session.createCriteria(B.class);
query.add(Restrictions.in("a", aList));
return query.list();
}
Then all works fine and the results I want are returned. However, if aList is empty (i.e. aList.size()==0) then the query.list function generates and executes invalid SQL for MySQL.
java.sql.SQLException: Syntax error or access violation message from server: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1"
I imagine that it is generating SQL like IN () which isn't valid.
I realize it's a bit ridiculous to want to find the rows where a field is IN the empty list. Nothing will ever be returned. However, in my opinion it should still be allowed, and return no rows, just as saying "WHERE 1=2" is allowed, just doesn't return any rows.
--
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....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
12 years, 1 month