休眠 - 无法执行语句; 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
我看到 hibernate
将 MapPoint
和 CommissionFee
定义为 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")
我正在尝试使用休眠保存嵌套对象,我收到 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
我看到 hibernate
将 MapPoint
和 CommissionFee
定义为 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")