插入后选择Hibernate

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入后选择Hibernate相关的知识,希望对你有一定的参考价值。

我在将新行插入mysql数据库时遇到问题。我正在使用Spring Boot和Spring Boot Data JPA。

由于MySQL不支持序列,我决定尝试创建自己的序列生成器表。这基本上就是我所做的。

  1. 我创建了一个使用自动增量字段的sequences表(用作我的表的id)。
  2. 创建了一个函数sequences_nextvalue(),它插入到sequences表中并返回新的自动递增id。
  3. 然后我在每个表上创建触发器,在插入之前触发,并用调用sequences_nextvalue()的结果替换id字段。

所以这在插入新行时工作正常。我在所有桌子上都获得了独特的ID。我遇到的问题是我的JPA实体。

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractBaseClass {
  @Id
  private Integer id = -1;
  ...
}

@Entity
public class ConcreteClass1 extends AbstractBaseClass {
  ...
}


@Entity
public class ConcreteClass2 extends AbstractBaseClass {
  ...
}

我希望能够从抽象基类中进行查询,因此我将@Id列放在该类中,并将@EntityInheritanceType.TABLE_PER_CLASS一起使用。我还将id初始化为-1,因为需要id来从我的spring crud存储库调用save()

在调用我的Spring数据save()CrudRepository函数之后,id的-1正确地被MySQL触发器替换,但save()返回的结果实体不会返回新的id,而是保留-1。查看SQL日志后,插入后不会调用select语句来获取新id,而是返回原始实体。

当你不使用qazxsw poi时,是否可以强制Hibernate在插入后重新选择实体以获取新的id?

任何帮助是极大的赞赏。

答案

只是想提供这个问题的最新消息。这是我的解决方案。

我没有创建MySQL @GeneratedValue来替换TRIGGER上的id,而是创建了一个Hibernate INSERT,它执行IdentifierGenerator来获取并返回一个新的id。

我的抽象基类现在看起来像这样。

CallableStatement

我的发电机看起来像这样。

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractBaseClass {

  @Id
  @GenericGenerator(name="MyIdGenerator", strategy="com.sample.model.CustomIdGenerator" )
    @GeneratedValue(generator="MyIdGenerator" )
  private Integer id;
  ...

}

仅供参考

public class CustomIdGenerator implements IdentifierGenerator { private Logger log = LoggerFactory.getLogger(CustomIdGenerator.class); private static final String QUERY = "{? = call sequence_nextvalue()}"; @Override public Serializable generate(SessionImplementor session, Object object) throws HibernateException { Integer id = null; try { Connection connection = session.connection(); CallableStatement statement = connection.prepareCall(QUERY); statement.registerOutParameter(1, java.sql.Types.INTEGER); statement.execute(); id = statement.getInt(1); } catch(SQLException e) { log.error("Error getting id", e); throw new HibernateException(e); } return id; } } 表。

sequences

CREATE TABLE sequences ( id INT AUTO_INCREMENT PRIMARY KEY, thread_id INT NOT NULL, created DATETIME DEFAULT CURRENT_TIMESTAMP ) ^; 功能

sequence_nextvalue

以上是关于插入后选择Hibernate的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA - Hibernate:批量插入执行太多选择 nextval('sequence')

在几个选择查询或插入查询后休眠挂起

JPA/Hibernate 批量(批量)插入

如何在文本区域标签中的特定光标位置插入选择标签下拉值作为文本片段?

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

配置更改后片段丢失过渡动画