【问题标题】:Spring boot CrudRepository save - exception is org.hibernate.type.SerializationException: could not serializeSpring boot CrudRepository 保存 - 异常是 org.hibernate.type.SerializationException:无法序列化
【发布时间】:2017-08-02 23:37:12
【问题描述】:

不知道为什么我在这里遇到问题,但是当我使用带有这些对象的 CrudRepository 保存时,我得到了 SerializationException(没有更多信息)。有人可以看看我的对象并让我了解为什么它们不能序列化吗?最后附上我的 pom.xml,以防万一有帮助。我正在使用 Postgres 数据库。

编辑:数据库和现在 - 表已创建,但对象未创建行。

实际的 CrudRepository 接口:

public interface AccountRepository extends CrudRepository<ZanyDishAccount, String> {}

ZanyDishAccount 实体:

@Entity
public class ZanyDishAccount {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;   // internal id of the customer account for a Zany Dish subscription

    private String status;

    @OneToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "company_id")
    private Company company;

    @OneToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "order_id")
    private Order order;

    public ZanyDishAccount() {}
    public ZanyDishAccount(Company company, Order order) {

        this.company = company;
        this.order = order;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [id = "+id+ ", company = " + company + ", status = " + status + "]";
    }

}

公司实体:

@Entity
public class Company {

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

    private String phoneNumber;

    private String website;

    private String name;

    private String uuid;

    private String country;

    public Company() {}
    public Company(String phoneNumber, String website, String name, String uuid, String country) {

        this.phoneNumber = phoneNumber;
        this.website = website;
        this.uuid = uuid;
        this.country = country;
    }

    public String getPhoneNumber ()
    {
        return phoneNumber;
    }

    public void setPhoneNumber (String phoneNumber)
    {
        this.phoneNumber = phoneNumber;
    }

    public String getWebsite ()
    {
        return website;
    }

    public void setWebsite (String website)
    {
        this.website = website;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public String getUuid ()
    {
        return uuid;
    }

    public void setUuid (String uuid)
    {
        this.uuid = uuid;
    }

    public String getCountry ()
    {
        return country;
    }

    public void setCountry (String country)
    {
        this.country = country;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [phoneNumber = "+phoneNumber+", website = "+website+", name = "+name+", uuid = "+uuid+", country = "+country+"]";
    }
}

订单实体:

@Entity
@Table(name = "_order")
public class Order {

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

    private String pricingDuration;

    private Items[] items;

    private String editionCode;

    public Order() {}

    public Order(String pricingDuration, Items[] items, String editionCode) {

        this.pricingDuration = pricingDuration;
        this.items = items;
        this.editionCode = editionCode;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPricingDuration ()
    {
        return pricingDuration;
    }

    public void setPricingDuration (String pricingDuration)
    {
        this.pricingDuration = pricingDuration;
    }

    public Items[] getItems ()
    {
        return items;
    }

    public void setItems (Items[] items)
    {
        this.items = items;
    }

    public String getEditionCode ()
    {
        return editionCode;
    }

    public void setEditionCode (String editionCode)
    {
        this.editionCode = editionCode;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [pricingDuration = "+pricingDuration+", items = "+items+", editionCode = "+editionCode+"]";
    }
}

感谢您的帮助!

迈克

【问题讨论】:

    标签: postgresql hibernate spring-boot spring-data-jpa entities


    【解决方案1】:

    嗯,这似乎是多方面的。让我们看看我是否可以提供帮助。最后一件事...

    没有自动创建表。

    我会查看 Spring 文档中的这一部分以了解最基本的方法:Initialize a database using Hibernate。例如,spring.jpa.hibernate.ddl-auto: create-drop 将在应用程序每次运行时删除并重新创建表。初始开发工作简单易行。更强大的是利用 Flyway or Liquibase 之类的东西。

    序列化问题

    因此,如果没有日志,并且您没有创建表这一事实,那么缺乏持久层将是假定的罪魁祸首。也就是说,当您有表和数据时,如果您没有所有相关表的存储库,您最终会遇到 StackOverflow 错误(序列化变为循环)。为此,您可以使用@JsonBackReference(子)和@JsonManagedReference(父)。我只为孩子使用了@JsonBackReference

    项目[]

    我不确定 Item.class 是什么样的,但这看起来像是我错过了第一轮的进攻配置。

    1. private Items[] items; 更改为private List&lt;Item&gt; items = new ArrayList&lt;Item&gt;();。用@ElementCollection注释。

    2. @Embeddable注释Item.class。

    【讨论】:

    • 嗨,Brian,我错过了一些基本的东西,比如空构造函数和每个字段的构造函数。我的数据库现在正在创建,但我收到此错误:“org.springframework.orm.jpa.JpaSystemException:无法序列化”。这是在我在控制台窗口中看到一些“select nextval ('hibernate_sequence') 行输出之后。但没有任何错误的迹象。我不知道为什么我的对象无法序列化。有没有办法获得更多调试? hibernate.SQL 和 hibernate.type.descriptor.sql.BasicBinder 都设置为 TRACE。我会更新问题中的类。thx
    • 我应该说,我的数据库和表现在正在创建中。只是对象没有创建行。
    • 如果你使用 --debug 运行,并且在 application.properties 中设置 spring.jpa.show-sql=true 会怎样?你有完整的堆栈跟踪吗?此外,我更新了我的答案,因为我注意到了一些额外的东西 (Items[])。
    • 布赖恩-我感激不尽!非常感谢——我真的需要那个——你太棒了。谢谢!!!! :) 干杯!
    • :) 完全没问题,希望我第一次发现。编码愉快!
    猜你喜欢
    • 2020-05-23
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多