2017-05-09 10 views
0

私はHibernateを初めて使用しており、問題に固執しています。 List < List < Coordinate >>を含むCustomObjectを保存できません。私はSpingBootでMySQLを使用しています。Hibernate java.lang.Integerフィールドcom.XXX.XXX.XXX.Coordinate.idをjava.util.ArrayListに設定できません

CustomOjbect:

@Entity 
public class CustomOjbect implements Serializable{ 

    private static final long serialVersionUID = -4288223602669270676L; 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 
    @Column(name = "img") 
    private String img; 
    @OneToOne(cascade=CascadeType.ALL) 
    private Feet feet; 
    @OneToMany(cascade=CascadeType.ALL, targetEntity=Coordinate.class) 
    private List<List<Coordinate>> coordinates = null; 
    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 
    //Other getter and setters here... 
} 

座標:

@Entity 
public class Coordinate implements Serializable{ 

    private static final long serialVersionUID = 7288778461661904967L; 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    @Column(name = "y") 
    private Float y; 
    @Column(name = "x") 
    private Float x; 

    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 
    //Getter and setters here... 
} 

フィート:

@Entity 
public class Feet implements Serializable { 

    private static final long serialVersionUID = -8438970667123556624L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    @Column(name = "height") 
    private Integer height; 

    @Column(name = "width") 
    private Integer width; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 
    //Getter and setters here 
} 

私はリストを行うときには、正常に動作するために使用を<>の代わりにリストの< <一覧<座標Coordinate >>、しかし私は持っていたクライアントサイドから送信されたオブジェクトがオブジェクトの配列の配列に変更されたときにそれを変更します。

これを修正するにはどうすればよいですか?

エラー:コントローラで

java.lang.IllegalArgumentException: Can not set java.lang.Integer field com.XXXX.XXXX.XXXX.Coordinate.id to java.util.ArrayList at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) ~[na:1.8.0_111] at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) ~[na:1.8.0_111] at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source) ~[na:1.8.0_111] at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source) ~[na:1.8.0_111] at java.lang.reflect.Field.get(Unknown Source) ~[na:1.8.0_111] at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:225) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4675) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4376) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:226) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:510) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:99) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:765) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:758) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.jpa.event.internal.core.JpaPersistEventListener$1.cascade(JpaPersistEventListener.java:80) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:398) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:162) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:431) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]

@RequestMapping(method = RequestMethod.POST, value = "/saveCustomObjects", consumes = MediaType.APPLICATION_JSON_VALUE) 
    @ResponseBody 
    public String saveImageDetails(@RequestBody CustomObject customObject) { 
     customObjectRepository.save(customObject); 
     return "Saved successfully"; 
    } 

編集

あなたは何を知っておく必要があるなら、私にお問い合わせください。

+0

クライアントから受け取ったオブジェクトを有効なエンティティモデルにマップしないのはなぜですか? – MGorgon

+0

@MGorgonどうすればよいですか?私はそれをやっていると思う。 –

+0

クライアントから何らかのDTOを受け取ったとしますか? – MGorgon

答えて

0

この問題が発生した場合。

MGorgonはコメントで指摘したようにListList< List< Object>>Listのが有効なのJPA関係ではないのに対し、実体List< Object>List有効なJPA関係です。

この問題を解決するために、クライアントから送信されたjson形式を変更しました。

JSON形式は前:変更後

{ 
    "coordinates": [ 
    [ 
     { 
     }, 
     { 
     } 
    [ 
     { 
     }, 
     { 
     }, 
     { 
     }, 
     { 
     } 
    ] 
    ] 
} 

JSON形式:

{ 
    "coordinates": [ 
    { 
     "area": [ 
     { 
     }, 
     { 
     } 
     ] 
    }, 
    { 
     "area": [ 
     { 
     }, 
     { 
     }, 
     { 
     ] 
    } 
    ] 
} 

注:私は、コードを減らすために、JSONにいくつかのプロパティを排除しています。

誰かを助けることを願っています。

関連する問題