我在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 Boot2。到目前为止,我有以下内容:
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;
/
希望有帮助