Oracle データベースに次のようなテーブルがあります。
| GROUP | SEQ | OTHER_DATA |
|-------|-----|------------|
| 1 | 1 | ~~~~~~~~~~ |
| 1 | 2 | ~~~~~~~~~~ |
| 1 | 3 | ~~~~~~~~~~ |
| 2 | 1 | ~~~~~~~~~~ |
| 2 | 2 | ~~~~~~~~~~ |
| 2 | 3 | ~~~~~~~~~~ |
ここGROUP
で、 は外部キーで、(GROUP, SEQ)
は主キーです。グループ 1 の次のレコードを挿入したいのですが、それは(1, <(MAX SEQ FOR GROUP 1) + 1>, <OTHER DATA>) = (1, 4, <OTHER DATA>)
.
私はSpring Boot 2を使用しています。これまでのところ、次のものがあります。
public class MyEntityPK implements Serializable {
private Long group;
private Long seq;
// getters and setters ...
}
@Entity
@Table(name = "MY_TABLE")
@IdClass(MyEntityPK.class)
public class MyEntity {
@Id
private Long group;
@Id
private Long seq;
@ManyToOne
@JoinColumn(name="GROUP", insertable=false, updatable=false)
private Group group;
private String otherData;
// getters and setters ...
}
public interface MyEntityRepository extends CrudRepository<MyEntity, MyEntityPK> {}
seq
次の例のように、フィールドを明示的に設定すると、すべてが機能します。
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyEntityTest {
@Autowired
MyEntityRepository repository;
@Test
public void testSaveMyEntityWithExplicitParameters() {
MyEntity entity = new MyEntity();
Group group = new Group(1L, "Group description");
entity.setGroup(group);
entity.setSeq(4L);
repository.save(entity);
}
}
MyEntityRepository
しかし、最大シーケンス値を取得して明示的に設定するために使用するサービスにロジックを追加せずに、永続化レイヤーでシーケンスをインクリメントする方法を理解できません。@GeneratedValue
グループを考慮せずに次に利用可能な値を生成するため、シーケンスジェネレーターでは使用できません。