休眠 - 无法执行语句; SQL [n/a] - 保存嵌套对象

hibernate - could not execute statement; SQL [n/a] - saving nested object

我正在尝试使用休眠保存嵌套对象,我收到 could not execute statement; SQL [n/a] Exception

代码

@Entity
@Table(name = "listing")
@Inheritance(strategy = InheritanceType.JOINED)
public class Listing implements Serializable {

  @Id
  @Column(name = "listing_id")
  private String listingId;

  @Column(name = "property_type")
  private PropertyType propertyType;

  @Column(name = "category")
  private Category category;

  @Column(name = "price_currency")
  private String priceCurrency;

  @Column(name = "price_value")
  private Double priceValue;

  @Column(name = "map_point")
  private MapPoint mapPoint;

  @Column(name = "commission_fee_info")
  private CommissionFeeInfo commissionFeeInfo;
}


public class MapPoint implements Serializable {

  private final float latitude;
  private final float longitude;
}

public class CommissionFeeInfo implements Serializable {

  private String agentFeeInfo;
  private CommissionFeeType commissionFeeType;
  private Double value;
  private Double commissionFee;
}

public enum CommissionFeeType implements Serializable { }

使用 RazorSQL 我看到 hibernateMapPointCommissionFee 定义为 VARBINARY

我无法理解的是,当 commissionFeeInfo 不存在时,hibernate 设法保存了它。保存MapPoint

没问题

有人知道我做错了什么吗?

更新

我发现如果 CommissionFeeInfo 除了 agentFeeInfo 的所有属性都是 null,那么对象将被保存而没有问题。如果其他属性之一是 != null,则会发生错误。

更新 2

我把CommissionFeeInfo的所有属性的类型改成了String,对象保存起来没有问题,但是我不能让属性变成String

我通过添加设置

解决了这个问题
@Column(name = "commission_fee_info", columnDefinition = "LONGVARBINARY")

作为 class Listing

字段 commisionFeeInfo 的注解

对我来说,

@Column(columnDefinition="text")

解决了我的问题。

出于不同的原因,该解决方案可能有所帮助。另一个原因可能是列长度。检查您的列长度。我有同样的错误,原因是我的数据超出了列的大小。

setSignInProvider("String length > 15 ") 

之前

    @Column(name = "sing_in_provider", length = 15)

然后

   @Column(name = "sing_in_provider", length = 100)

我也遇到了同样的问题。然后我解决了问题

spring.jpa.hibernate.ddl-auto=update

对我来说,我在 sql table 中使用 current_date 作为字段。但这是 SQL 中的关键字,所以我不能使用这个名称。我将字段名称更改为 current_date_and_time 它对我有用。我还在我的实体 class.

上添加了列名
@Column(name = "current_date_and_time")