2014-03-25 19 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配置。當這個異常提出?你有一些測試代碼? –