【问题标题】:Hibernate Can not set java.lang.Integer field com.XXX.XXX.XXX.Coordinate.id to java.util.ArrayListHibernate 无法将 java.lang.Integer 字段 com.XXX.XXX.XXX.Coordinate.id 设置为 java.util.ArrayList
【发布时间】:2017-10-08 07:53:20
【问题描述】:

我是 Hibernate 的新手,遇到了一个问题。我无法保存包含 List> 的 CustomObject。我正在将 MySQL 与 SpingBoot 一起使用。

自定义对象:

@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
}

当我使用 List 而不是 List> 时,它曾经可以正常工作,但我不得不更改它,因为从客户端发送的对象更改为对象数组的数组。

我该如何解决这个问题?

错误:

java.lang.IllegalArgumentException: 无法设置 java.lang.Integer 字段 com.XXXX.XXXX.XXXX.Coordinate.id 到 java.util.ArrayList 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(未知 来源)~[na:1.8.0_111] 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(未知 来源)~[na:1.8.0_111] 在 sun.reflect.UnsafeFieldAccessorImpl.ensureObj(未知来源) ~[na:1.8.0_111] 在 sun.reflect.UnsafeObjectFieldAccessorImpl.get(未知来源) ~[na:1.8.0_111] 在 java.lang.reflect.Field.get(未知来源) ~[na:1.8.0_111] 在 org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:225) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4675) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4376) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:226) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:510) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:99) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:765) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.internal.SessionImpl.persist(SessionImpl.java:758) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.jpa.event.internal.core.JpaPersistEventListener$1.cascade(JpaPersistEventListener.java:80) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:398) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:162) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 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";
    }

编辑

如果您需要了解任何信息,请询问我。

【问题讨论】:

  • 为什么不将从客户端收到的对象映射到您的有效实体模型?
  • @MGorgon 我该怎么做?我想我正在这样做。
  • 我想您从客户那里收到了某种 DTO?
  • @MGorgon 请检查我是否已将控制器添加到我进行保存的位置。
  • 因为实体列表是有效的 jpa 关系。列表列表不是。所以你需要把你的表现模型和持久化模型分开,并引入它们之间的映射。

标签: java mysql hibernate spring-boot


【解决方案1】:

对于那些面临这个问题的人。

正如 MGorgon 在实体 List&lt; Object&gt; 的 cmets 中指出的那样,List有效的 jpa 关系,而 ListList List&lt; List&lt; Object&gt;&gt; 不是有效的 jpa关系

所以为了解决这个问题,我更改了客户端发送的 json 格式。

之前的JSON格式:

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

改变后的JSON格式:

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

注意:我已经删除了 json 中的一些属性以减少代码。

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2017-02-18
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多