[英]Spring Data JPA - Entities with composite key in which one column is an internal sequence related to the other
我在 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
的服務添加邏輯來獲取最大 seq 值並顯式設置它。 我不能將@GeneratedValue
與序列生成器一起使用,因為它會在不考慮組的情況下生成下一個可用值。
作為建議,您可以嘗試觸發器,請找到原始示例:
CREATE OR REPLACE TRIGGER seq_upd_before_insert
BEFORE INSERT
ON MY_TABLE
FOR EACH ROW
DECLARE
v_seq number;
BEGIN
-- Find max seq for performing INSERT into your table
SELECT max(seq) INTO v_seq
FROM MY_TABLE
WHERE group = :new.group
GROUP BY group;
-- Update new seq field to max seq + 1 before insert
:new.seq := v_seq + 1;
END;
/
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.