2017-03-10 2 views
1

내가 가진 :JDO, org.json.simple.JSONObject과 PostgreSQL JSON 형식

CREATE TABLE category (
    // ... 
    category_name_localization JSON not null, 
); 

자바에서, 나는 JDO 클래스과 같이 있습니다

@javax.jdo.annotations.PersistenceCapable(table = "category") 
public class Category extends _BlueEntity implements Serializable { 
    //... 

    private org.json.simple.JSONObject category_name_localization; 

    @javax.jdo.annotations.Column(name = "category_name_localization") 
    public org.json.simple.JSONObject getCategoryNameLocalization() { 
     return category_name_localization; 
    } 
} 

언제

org.datanucleus.exceptions.NucleusUserException: Field "com.advantagegroup.blue.ui.entity.Category.category_name_localization" is a map that has been specified without a join table and neither the key nor the value has a mapped-by specified. This is invalid! 
       at org.datanucleus.store.rdbms.RDBMSStoreManager.newJoinTable(RDBMSStoreManager.java:2720) 
       at org.datanucleus.store.rdbms.mapping.java.AbstractContainerMapping.initialize(AbstractContainerMapping.java:82) 
       at org.datanucleus.store.rdbms.mapping.MappingManagerImpl.getMapping(MappingManagerImpl.java:680) 
       at org.datanucleus.store.rdbms.table.ClassTable.manageMembers(ClassTable.java:518) 
       at org.datanucleus.store.rdbms.table.ClassTable.manageClass(ClassTable.java:424) 
       at org.datanucleus.store.rdbms.table.ClassTable.initializeForClass(ClassTable.java:1250) 
       at org.datanucleus.store.rdbms.table.ClassTable.initialize(ClassTable.java:271) 
       at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.initializeClassTables(RDBMSStoreManager.java:3288) 
       at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2897) 
       at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:118) 
       at org.datanucleus.store.rdbms.RDBMSStoreManager.manageClasses(RDBMSStoreManager.java:1637) 
       at org.datanucleus.store.rdbms.RDBMSStoreManager.getDatastoreClass(RDBMSStoreManager.java:665) 
       at org.datanucleus.store.rdbms.RDBMSStoreManager.getPropertiesForGenerator(RDBMSStoreManager.java:2098) 
       at org.datanucleus.store.AbstractStoreManager.getStrategyValue(AbstractStoreManager.java:1278) 
       at org.datanucleus.ExecutionContextImpl.newObjectId(ExecutionContextImpl.java:3668) 
       at org.datanucleus.state.StateManagerImpl.setIdentity(StateManagerImpl.java:2276) 
       at org.datanucleus.state.StateManagerImpl.initialiseForPersistentNew(StateManagerImpl.java:482) 
       at org.datanucleus.state.StateManagerImpl.initialiseForPersistentNew(StateManagerImpl.java:122) 
       at org.datanucleus.state.ObjectProviderFactoryImpl.newForPersistentNew(ObjectProviderFactoryImpl.java:218) 
       at org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:1986) 
       at org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1830) 
       at org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1685) 
       at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:712) 
       at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:738) 
       at com.advantagegroup.blue.ui.jdo._BlueJdo.insert(_BlueJdo.java:40) 
       at ... 

이 오류는 org.json.simple.JSONObject 전 때문에 방법으로 의미가 있습니다 :이 클래스를 사용, DataNucleus 다음과 같은 예외가 있습니다 는 Map입니다. 그러나,이 필드는 어떤 관계의 일부가 아닙니다 - 그것은 유형 JSON이며 따라서 내가 진정과는 Stringorg.json.simple.JSONObject 같은 방법으로 치료하는 JDO/DataNucleus을 어떻게 알 수 있습니까 JSONObject

그것을 다시 자연 또는 Date?

감사합니다! DC

+0

인식 할 수없는 유형이므로 JDO "AttributeConverter"를 제공 할 생각이 있습니까? –

+0

나는 이것을 시도했지만 변환기를 사용하더라도 DataNucleus는 여전히 관련 테이블을 찾고있다. 문제는 필드를 저장할 수 없다는 것이 아닙니다. 문제는 JDO가 자동으로 필드가 다 대다 매핑의 일부라고 생각한다는 것이다. 나는이 필드가 다른 클래스/테이블에 매핑되어 있지 않다는 것을 JDO에 알리는 방법을 알 수 없다. –

+0

질문에 게시 하시겠습니까? 스택 추적을 게시하면 코드를 아는 사람이 누구인지 알 수 있습니다. –

답변

1

이의 나의 이해는 기본 시도가 (그것이 JSONObject가 무엇인지 나던 동안, 그것은 Map이 무엇인지 알 수 없기 때문에) 정상 Map을 유지하려고하고, 그것이가 테이블에 참여해야 할 것입니다 RDBMS에 대한 것입니다.

아마도 JSONObject을 단일 열로 유지하려고하므로 JDO AttributeConverter을 만들어야합니다. 내 자신의 형식과 비슷한 일을 했어 그리고 그것은 잘 작동합니다 (전 v5.0.5 IIRC에있어).

당신이 자신의 Map 클래스를 가지고있을 때 (put, putAll 등의 호출을 가로 채기 위해) 프록시로 대체하는 방법을 기본으로 처리하는 방법을 모르는 경우에 대해서도 마찬가지입니다. 해당 행을 추가하면이 필드를 프록시로 랩핑하지 않습니다 (사용자가 알리지 않는 한 해당 유형에 대해 수행하는 방법을 알지 못함). JSONObject가 "더티 (dirty)"가되도록 자동 감지하려면 this page에 따라 프록시 래퍼를 작성해야합니다.

PostgreSQL에서 "JSON"형식을 사용하는 계산기에 열을 매핑하는 방법을 응답하지 않습니다,하지만 난 당신이 하는 sqlType를 설정하면 당신은 그런 점에서 성공을 얻을 수 있다는 추측에는 요.

+0

변환기만으로는 제대로 작동하지 않았습니다. 그러나 래퍼로 모든 것이 완벽하게 작동했습니다! –