2014-03-25 13 views
0

得到以下错误:DB2,OpenJPA中,@ManyToMany:错误 “预期varchar类型,但列类型是BLOB”

<openjpa-2.2.2-r422266:1468616 fatal user error> org.apache.openjpa.persistence.ArgumentException: "com.qbe.asia.ebusiness.admin.intermediary.Intermediary.employees<element:class com.qbe.asia.ebusiness.admin.intermediary.Employee>" declares a column that is not compatible with the expected type "varchar". Column details: 
Full Name: TINT_STAFF.STAFF_ID 
Type: blob 
Size: 0 
Default: null 
Not Null: false 

中介,JAVA

@Entity 
@Table(name = "TINTERMEDIARY") 
public class Intermediary { 

    @Id 
    @Column(name="INTERMEDIARY_ID") 
    private String intermediaryId; 

    @ManyToMany 
    @JoinTable(name="TINT_STAFF", 
     joinColumns = { 
        @JoinColumn(name = "INTERMEDIARY_ID"), 
        @JoinColumn(name = "STAFF_ID")}, 
     inverseJoinColumns = { 
        @JoinColumn(name = "STAFF_ID""), 
        @JoinColumn(name = "INTERMEDIARY_ID")}) 
    private List<Employee> employees; 
} 

Employee.java

@Entity 
@Table(name="TSTAFFMEMBER") 
public class Employee { 

    @Id 
    @Column(name="STAFF_ID") 
    private String employeeId; 

    @ManyToMany (mappedBy = "employees") 
    private List<Intermediary> intermediaries; 
} 

TINT_STAFF表

CREATE TABLE TINT_STAFF 
(
    INTERMEDIARY_ID CHAR(19) NOT NULL, 
    STAFF_ID CHAR(19) NOT NULL, 
    PRIMARY KEY (INTERMEDIARY_ID, STAFF_ID) 
); 

所有的id字段都是CHAR(19)。

没有关联映射就像一个魅力,但只要我通过TINT_STAFF表添加ManyToMany,它说列是一个blob ..但事实并非如此。为什么?

更新:失败

@Autowired 
IntermediaryDaoJpaImpl dao; //this works fine 

@Test 
public void getIntermediariesTest() { 
    List<Intermediary> intermediaries = dao.getIntermediaries(); 
    for(Intermediary intermediary : intermediaries) { 
     System.out.println("Employees: "+intermediary.getEmployees()); 
     assert intermediary.getEmployees() != null; 
    } 
} 

测试:

@PersistenceContext 
private EntityManager entityManager; //this works 

public List<Intermediary> getIntermediaries() { 
    Query query = entityManager.createQuery("select o FROM Intermediary o"); 
    return query.getResultList(); 
} 

的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
     <jta-data-source>java:comp/env/jdbc/Datasource</jta-data-source> 
     <class>com.qbe.asia.ebusiness.admin.intermediary.Intermediary</class> 
     <class>com.qbe.asia.ebusiness.admin.intermediary.Employee</class> 
     <properties> 
      <property name="openjpa.jdbc.DBDictionary" value="db2(batchLimit=0)"/> 
      <property name="openjpa.Log" value="SQL=TRACE" /> 
      <property name="openjpa.ConnectionFactoryProperties" value="PrettyPrint=true, PrettyPrintLineLength=72" /> 
      <property name="openjpa.RuntimeUnenhancedClasses" value="supported" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

回答

0

更改@JoinTable注释:

@JoinTable(name="TINT_STAFF", 
    joinColumns = @JoinColumn(name = "INTERMEDIARY_ID"), 
    inverseJoinColumns = @JoinColumn(name = "STAFF_ID"")) 

也许你想要做那样的事情。

+0

这会将员工设置为null,并执行懒取。它急于获取它抛出 org.apache.openjpa.persistence.PersistenceException:null FailedObject:select o FROM Intermediary o [java.lang.String]。 [.....................]引起:java.lang.NullPointerException \t at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.setInverseRelation(JDBCStoreManager。 java:453) \t at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:413) –

+0

同样来自另一端,如果懒惰,则为null如果是eager: org.apache.openjpa.persistence.PersistenceException:null FailedObject:select o FROM Employee o [java.lang.String] –

+0

这是一个非常简单的关系,它应该按预期工作,也许你有什么问题JPA配置。当这个异常提出?你有一些测试代码? –