Spring jpaリポジトリをhibernateで使用して、エンティティをOracleデータベースに保存しています。 Spring-Hibernateを使用してOracleデータベースシーケンスの次の値を取得するにはどうすればよいですか?
これは私のイベントクラスです。
@Entity
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Long seriesId;
private String description;
public Event() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getSeriesId() {
return seriesId;
}
public void setSeriesId(Long seriesId) {
this.seriesId = seriesId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
イベントリゾルバーのすべてのイベントシリーズに対して、シーケンスの次の値を1回取得する必要があります。
public class EventResolver {
@Autowired
private EventRepository eventRepository;
public void createSeriesOfEvents(List<EventAPI> eventsToCreate){
Long seriesId = null; // TODO: Get the series id from database sequence
for (EventAPI currEvent : eventsToCreate){
Event newEvent = new Event();
newEvent.setDescription(currEvent.description);
newEvent.setSeriesId(seriesId);
eventRepository.save(newEvent);
}
}
}
助けてくれてありがとう。
最後に、Springの方法で問題を解決しました。必要なのは、次のようにJpaRepositoryにネイティブクエリを追加することです。
public interface EventRepository extends JpaRepository<Event, Long> {
@Query(value = "SELECT seq_name.nextval FROM dual", nativeQuery =
true)
Long getNextSeriesId();
Spring 5では、このタスクに OracleSequenceMaxValueIncrementer のような組み込みクラスの1つを使用できます。
このパッケージで利用可能なすべてのオプションを参照してください: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/support/incrementer/package-summary.html =
JPAでこのアプローチを使用できます。
Query q = em.createNativeQuery("select seq_name.nextval from dual");
return (Long)q.getSingleResult();
Idプロパティに次のように注釈を付けます。
@Id
@GeneratedValue(generator = "idSequence")
@SequenceGenerator(schema = "MYORASCHEMA", name = "idSequence", sequenceName = "MY_Oracle_SEQ_NAME", allocationSize = 1)
@Column(name="ID")
private Long id;