1

Hibernate と JPA (最新の Hibernate バージョン 4.2.2 にアップグレードしました) を使用していますが、奇妙なエラーが発生します。「... のリフレクション ゲッターによってフィールド値を取得できませんでした」

JPA、Hibernate、継承を使用しています。

私のコード。

AbstractGraphPropertyContainer.java

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="containertype", discriminatorType=DiscriminatorType.STRING)
@Table(name="graphcontainers")
public abstract class AbstractGraphPropertyContainer implements DataObject  {


public AbstractGraphPropertyContainer(){    

}   

public AbstractGraphPropertyContainer(long id){ 
    this.id = id;
}

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="containerid")
long id;

@Column(name = "searchable")
public boolean searchable = true;

@Transient
Map<String, String> properties = new Hashtable<String, String>();

@Transient
private boolean retrieved = false;

static PortalFactory factory = SQLGraphManager.factory;

public long getID(){
    Hibernate.initialize(this);
    return this.id;
}


public void delete(){

    Session session = null;

    try {

        SessionFactory sFactory = SQLGraphManager.fac;
        session = sFactory.getCurrentSession();
        Transaction tr = session.beginTransaction();

        //Save this object
        session.delete(this);

        tr.commit();

    }catch(HibernateException he){
        throw new RuntimeException(he);
    }

}

public void save(){

    if(this.id > 0){
        this.update();
        return;
    }

    Session session = null;

    try {


        SessionFactory sFactory = SQLGraphManager.fac;
        session = sFactory.getCurrentSession();
        Transaction tr = session.beginTransaction();

        //Save this object
        session.save(this);

        tr.commit();


    }catch(HibernateException he){


        throw new RuntimeException(he);
    }

}

public void update(){


    Session session = null;

    try {
        SessionFactory sFactory = SQLGraphManager.fac;
        session = sFactory.getCurrentSession();
        Transaction tr = session.beginTransaction();

        //Save this object
        session.update(this);

        tr.commit();



    }catch(HibernateException he){

        throw new RuntimeException(he);           
    }       

}
}

SQLGraph.java

@Entity
@Table(name="graphs")
@PrimaryKeyJoinColumn(name="graphid")
@DiscriminatorValue("GRAPH")
public class SQLGraph extends AbstractGraphPropertyContainer implements Graph {


@Column(name="graph_name")
String name;

@Column(name="graph_description")
String description;

@Column(name="schemalocked")
boolean schemaLocked;

@Column(name="detached")
boolean detached;

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="graphs_schemas", 
        joinColumns={@JoinColumn(name="graphid")}, 
        inverseJoinColumns={@JoinColumn(name="schemaid")})
private Set<SQLGraphSchema> schemas = new TreeSet<SQLGraphSchema>();

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="graphs_objects", 
        joinColumns={@JoinColumn(name="graphid")}, 
        inverseJoinColumns={@JoinColumn(name="objectid")})  
private Set<SQLGraphObject> objects = new TreeSet<SQLGraphObject>();

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="graphs_relationships", 
        joinColumns={@JoinColumn(name="graphid")}, 
        inverseJoinColumns={@JoinColumn(name="relationshipid")})    
private Set<SQLGraphRelationship> relationships = new TreeSet<SQLGraphRelationship>();


}

SQLGraphAction.java

@Entity
@Table(name="zeusportalgraphactions_typemap") 
@PrimaryKeyJoinColumn(name="actionid")
@DiscriminatorValue("ACTION")
public class SQLGraphAction extends SQLGraphRelation<Member, GraphObject> implements
    GraphAction {



@ManyToOne
@JoinColumn(name="endobjectid") 
SQLGraphObject endObject;

@ManyToOne
@JoinColumn(name="typeid")
SQLGraphActionType type;            

}

SQLGraphObject.java

@Entity
@Table(name="graphobjects") 
@PrimaryKeyJoinColumn(name="objectid")
@DiscriminatorValue("OBJECT")
public class SQLGraphObject extends AbstractGraphPropertyContainer implements
    GraphObject {


@Column(name="label")
String label;

@ManyToOne
@JoinColumn(name="typeid")
SQLGraphObjectType type;

@OneToMany(mappedBy="startObject")
private Set<SQLGraphRelationship> relationships = new TreeSet<SQLGraphRelationship>();

@OneToMany(mappedBy="endObject")
private Set<SQLGraphRelationship> incRelationships =  new TreeSet<SQLGraphRelationship>();

@OneToMany(mappedBy="endObject")
private Set<SQLGraphAction> actions = new TreeSet<SQLGraphAction>();

}

エラー:

Caused by: java.lang.RuntimeException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.enetexperience.zeusportal.sql.graph.SQLGraphObject.actions
                                                        at com.enetexperience.zeusportal.sql.graph.AbstractGraphPropertyContainer.save(AbstractGraphPropertyContainer.java:269)
                                                        at com.enetexperience.zeusportal.sql.graph.SQLGraphManager.createObject(SQLGraphManager.java:306)
                                                        at com.enetexperience.zeusportal.graph.GraphManagerProxy.createObject(GraphManagerProxy.java:191)
                                                        at com.enetexperience.zeusportal.graph.GraphManagerProxy.getObject(GraphManagerProxy.java:330)
                                                        at com.enetexperience.zeusportal.graph.GraphSearchManager.addToIndex(GraphSearchManager.java:181)
                                                        at com.enetexperience.zeusportal.graph.GraphSearchManager.updateIndex(GraphSearchManager.java:455)
                                                        ... 3 more
                                                      Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.enetexperience.zeusportal.sql.graph.SQLGraphObject.actions
                                                        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
                                                        at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValue(AbstractEntityTuplizer.java:630)
                                                        at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:4522)
                                                        at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:166)
                                                        at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:424)
                                                        at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:263)
                                                        at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
                                                        at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
                                                        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206)
                                                        at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
                                                        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191)
                                                        at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
                                                        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
                                                        at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
                                                        at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756)
                                                        at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
                                                        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                                                        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
                                                        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                                                        at java.lang.reflect.Method.invoke(Method.java:616)
                                                        at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
                                                        at sun.proxy.$Proxy80.save(Unknown Source)
                                                        at com.enetexperience.zeusportal.sql.graph.AbstractGraphPropertyContainer.save(AbstractGraphPropertyContainer.java:261)
                                                        ... 8 more
                                                      Caused by: java.lang.IllegalArgumentException: Can not set java.util.Set field com.enetexperience.zeusportal.sql.graph.SQLGraphObject.actions to com.enetexperience.zeusportal.sql.graph.SQLGraphObject
                                                        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
                                                        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
                                                        at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
                                                        at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
                                                        at java.lang.reflect.Field.get(Field.java:376)
                                                        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
                                                        ... 30 more

このエラーの原因について、StackOverFlow やその他の情報源を調べました。しかし、運がありません。SQLGraphObject を保存するときにエラーが発生します。どうやら、保存時に SQLGraphObject オブジェクトを Set プロパティに割り当てようとしているようです。

興味深いことに、同じスーパー クラスから拡張された SQLGraph は問題なく保存されます。

エラーの原因となっている SQLGraphObject について何かがあると思いますが、それと SQLGraph の違いはわかりません。

更新: SQLGraphObject のセット マッピングを削除すると、文字列とプリミティブ フィールドで同じエラーが発生します。すべてのフィールド マッピングを削除すると、スーパークラス AbstractGraphPropertyContainer.java の id および検索可能なフィールドに関して同じエラーが発生します。SQLGraph を保存しても問題はありません。

4

0 に答える 0