From ea49b4cc6abcbf3cb38468a01df4187151fa5498 Mon Sep 17 00:00:00 2001 From: Fay Wang Date: Thu, 25 Feb 2010 03:33:00 +0000 Subject: [PATCH] OPENJPA-1536: fix the where clause in sql generation problem when join table strategy is used in toOne eager fetch git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@916106 13f79535-47bb-0310-9956-ffa450edef68 --- .../strats/InValueDiscriminatorStrategy.java | 2 +- .../inheritance/TestJoinTableStrategy.java | 87 +++++++++++++ .../inheritance/entity/Department.java | 91 +++++++++++++ .../inheritance/entity/Employee.java | 123 ++++++++++++++++++ .../inheritance/entity/FTEmployee.java | 46 +++++++ .../inheritance/entity/Manager.java | 50 +++++++ .../inheritance/entity/PTEmployee.java | 47 +++++++ 7 files changed, 445 insertions(+), 1 deletion(-) create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestJoinTableStrategy.java create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Department.java create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Employee.java create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/FTEmployee.java create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Manager.java create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/PTEmployee.java diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/InValueDiscriminatorStrategy.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/InValueDiscriminatorStrategy.java index 3dbf4a88a..94f33c9fe 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/InValueDiscriminatorStrategy.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/InValueDiscriminatorStrategy.java @@ -141,10 +141,10 @@ public abstract class InValueDiscriminatorStrategy Column col = disc.getColumns()[0]; SQLBuffer sql = new SQLBuffer(sel.getConfiguration(). getDBDictionaryInstance()); + String alias = sel.getColumnAlias(col, joins); boolean outer = joins != null && joins.isOuter(); if (outer) sql.append("("); - String alias = sel.getColumnAlias(col, joins); sql.append(alias); // if not selecting subclasses, limit to just the given class diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestJoinTableStrategy.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestJoinTableStrategy.java new file mode 100644 index 000000000..10fd508e4 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestJoinTableStrategy.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openjpa.persistence.inheritance; + +import javax.persistence.EntityManager; + +import org.apache.openjpa.persistence.inheritance.entity.Department; +import org.apache.openjpa.persistence.inheritance.entity.Employee; +import org.apache.openjpa.persistence.inheritance.entity.FTEmployee; +import org.apache.openjpa.persistence.inheritance.entity.PTEmployee; +import org.apache.openjpa.persistence.inheritance.entity.Manager; +import org.apache.openjpa.persistence.test.SingleEMFTestCase; + +/** + * Originally reported in the context of entities of a inheritance hierarchy with + * JOIN_TABLE strategy. + * + * OPENJPA-1536 + * + * @author Jody Grassel + * @author Fay Wang + * + */ +public class TestJoinTableStrategy extends SingleEMFTestCase { + + public void setUp() { + super.setUp(CLEAR_TABLES, Department.class, Employee.class, + PTEmployee.class, FTEmployee.class, Manager.class); + + EntityManager em = emf.createEntityManager(); + em.getTransaction().begin(); + Manager m = new Manager(); + m.setId(1); + m.setFirstName("mf1"); + m.setLastName("ml1"); + m.setSalary(1000000); + m.setVacationDays(20); + + Department d = new Department(); + d.setId(1); + d.setDepartmentName("d1"); + d.setDepartmentManager(m); + m.setDepartment(d); + + Employee e1 = new Employee(); + e1.setId(2); + e1.setFirstName("ef1"); + e1.setLastName("el1"); + e1.setDepartment(d); + e1.setManager(m); + e1.setVacationDays(20); + + em.persist(m); + em.persist(d); + em.persist(e1); + em.getTransaction().commit(); + em.close(); + } + + @Override + public void tearDown() { + // problem deleting table in MySQL + } + + public void testFindEntity() { + EntityManager em1 = emf.createEntityManager(); + Manager m = em1.find(Manager.class, 1); + assertNotNull(m); + em1.close(); + } +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Department.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Department.java new file mode 100644 index 000000000..4bf596c4c --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Department.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openjpa.persistence.inheritance.entity; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +/** + * Test case and domain classes were originally part of the reported issue + * OPENJPA-1536 + * + * @author Jody Grassel + * @author Fay Wang + * + */ +@Entity +@Table(name="CDepartment") +public class Department { + @Id + private int id; + + private String departmentName; + + @ManyToOne + private Manager departmentManager; + + @OneToMany(mappedBy="department") + private List employeeList; + + public Department() { + this.employeeList = new ArrayList(); + } + + public Department(int id, String departmentName) { + this.employeeList = new ArrayList(); + this.id = id; + this.departmentName = departmentName; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getDepartmentName() { + return departmentName; + } + + public void setDepartmentName(String departmentName) { + this.departmentName = departmentName; + } + + public Manager getDepartmentManager() { + return departmentManager; + } + + public void setDepartmentManager(Manager departmentManager) { + this.departmentManager = departmentManager; + } + + public List getEmployeeList() { + return employeeList; + } + + +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Employee.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Employee.java new file mode 100644 index 000000000..5dc26a726 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Employee.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openjpa.persistence.inheritance.entity; + +import javax.persistence.DiscriminatorColumn; +import javax.persistence.DiscriminatorType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Version; + +/** + * Test case and domain classes were originally part of the reported issue + * OPENJPA-1536 + * + * @author Jody Grassel + * @author Fay Wang + * + */ +@Entity +@Table(name="CEmployee") +@Inheritance(strategy=InheritanceType.JOINED) +@DiscriminatorColumn(name="EMP_TYPEL", discriminatorType=DiscriminatorType.INTEGER) +public class Employee { + + @Id + private int id; + + private String lastName; + private String firstName; + + private int vacationDays; + + @ManyToOne + private Manager manager; + + @ManyToOne + private Department department; + + @Version + private long version; + + private transient String str = null; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + str = null; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + str = null; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + str = null; + } + + public int getVacationDays() { + return vacationDays; + } + + public void setVacationDays(int vacationDays) { + this.vacationDays = vacationDays; + str = null; + } + + public Manager getManager() { + return manager; + } + + public void setManager(Manager manager) { + this.manager = manager; + str = null; + } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + str = null; + } + + public long getVersion() { + return version; + } + + +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/FTEmployee.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/FTEmployee.java new file mode 100644 index 000000000..48202ea92 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/FTEmployee.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openjpa.persistence.inheritance.entity; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +/** + * Test case and domain classes were originally part of the reported issue + * OPENJPA-1536 + * + * @author Jody Grassel + * @author Fay Wang + * + */ +@Entity +@DiscriminatorValue("2") +public class FTEmployee extends Employee { + private double salary; + + public double getSalary() { + return salary; + } + + public void setSalary(double salary) { + this.salary = salary; + } + + +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Manager.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Manager.java new file mode 100644 index 000000000..4802685d1 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/Manager.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openjpa.persistence.inheritance.entity; + +import java.util.List; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.OneToMany; + +/** + * Test case and domain classes were originally part of the reported issue + * OPENJPA-1536 + * + * @author Jody Grassel + * @author Fay Wang + * + */ +@Entity +@DiscriminatorValue("3") +public class Manager extends FTEmployee { + @OneToMany(mappedBy="manager") + private List managesList; + + public List getManagesList() { + return managesList; + } + + public String toString() { + String str = super.toString(); + return "Manager " + str; + } + +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/PTEmployee.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/PTEmployee.java new file mode 100644 index 000000000..f472e0851 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/entity/PTEmployee.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openjpa.persistence.inheritance.entity; +import javax.persistence.*; + +/** + * Test case and domain classes were originally part of the reported issue + * OPENJPA-1536 + * + * @author Jody Grassel + * @author Fay Wang + * + */ +@Entity +@DiscriminatorValue("1") +public class PTEmployee extends Employee { + private float hourlyWage; + + public PTEmployee() { + super(); + } + + public float getHourlyWage() { + return hourlyWage; + } + + public void setHourlyWage(float hourlyWage) { + this.hourlyWage = hourlyWage; + } + +}