【问题标题】:Hibernate doesn't persist when inserting long texts插入长文本时休眠不会持续存在
【发布时间】:2019-03-17 13:37:47
【问题描述】:

我使用的是 Postgresql 9.6,在使用 mySQL 之前,我在这两个数据库中遇到了同样的问题。我对 Hibernate 4 和 5 也有同样的问题。

当我试图持久化一个带有长字符串的对象时,它永远不会结束方法 session.persist(object)。另一方面,当字符串 ismySQL 和我在两个数据库中遇到相同的问题时,它可以完美运行。 没那么长,就像这一段。

VehicleDAO.java 中的 addVehicle 方法

public Vehicle addVehicle(Vehicle vehicle) {
    Session session = 
    this.sessionFactory.getCurrentSession();
    session.persist(vehicle);
    return vehicle;
}

车辆属性:

public class Vehicle {

    @Id
    @Column(name = "idvehicle")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    int idVehicle;

    @Column(name = "name")
    String name;

    @Column(name = "description")
    String description;

    @Column(name = "photob64")
    String photoB64;

Eclipse 控制台日志:

Hibernate: insert into vehicle (description, name, photob64, idvehicletype) values (?, ?, ?, ?)

【问题讨论】:

  • 要检查两件事:1. DB 中的列可能有限制最大字符数量的约束 2. 检查最后是否提交了事务
  • @KamilW。在 Postgresql 中,文本类型列的限制是 1GB
  • 你能直接在DB上执行这个SQL吗?它将允许我们跟踪问题可能出现在哪一侧(休眠/数据库)。
  • 问题出在数据库端。如果我通过控制台执行查询会挂起
  • 这个字符串有多长?也许它需要更多的时间来插入。执行查询并离开 if 几分钟,看看之后会发生什么,我认为 postgres 必须返回一些错误代码。

标签: java mysql spring postgresql hibernate


【解决方案1】:

插入长文本时休眠不会持续

根据您的问题,插入长文本时它不会持续存在。这是因为默认字符串长度为 255。您可以在数据库中看到。 VARCHAR(255) 长度为 255。 您可以使用以下方法提及长度:

@Column(name=" description", length = 300)
private String description;

如果您不确定长度,那么最好根据需要使用 lob、blob 或 clob。您可以阅读 lob、blob 和 clob 的详细信息并选择其中之一。对于文本 lob 或 clob 会为您工作。

【讨论】:

  • 如我所说,Postgresql 中的 TEXT 类型有 1GB 的容量
  • 我不确定您为什么在应用程序中使用 getCurrentSession() 而不是 openSession()。如果是 Web 应用程序,最好使用 openSession。也试试这种方法。如果我的回答不能解决你的问题。请记住,在 openSession 的情况下,您需要关闭会话。 openSession 和 getCurrentSession 之间存在差异。您也可以通过它并更好地理解它。
  • 使用 openSession() 什么都不做
【解决方案2】:

有两种方法,

  1. 你可以设置 columnDefinition 像

    @Column(name = "notes", columnDefinition = "varchar(300)")
    private String notes;
    
  2. 如果您不知道字符串的最大长度,您可以将 columnDefinition 设置为类似文本

    @Column(name = "notes", columnDefinition = "text")
    private String notes;
    

【讨论】:

    【解决方案3】:

    我知道发生了什么。由于无法将信息完全传输到其他设备(Raspberry Pi)中的数据库,因此该方法永远不会结束。

    我将我的 PC 和 Raspberry Pi 的网络适配器的 MTU 更改为 1492,使用以下命令:

    sudo ifconfig eth0 mtu 1492
    

    更多信息:http://www.ubuntugeek.com/how-to-change-mtu-maximum-transmission-unit-of-network-interface-in-ubuntu-linux.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多