插入后选择Hibernate

问题描述 投票:0回答:1

我在将新行插入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 spring hibernate spring-data
1个回答
0
投票

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

我没有创建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
© www.soinside.com 2019 - 2024. All rights reserved.