Java Persistence API
...
Transaction management refers to the tasks of processing multiple transactions issued by various clients of a database server in such a way that the ACID contract can be fulfilled, that is, the properties of atomicity, consistency preservation, isolation, and durability of each individual transaction can be guaranteed. Transaction management is generally understood as requiring serializability-based concurrency control as well as recovery from failures. Concurrency control is the task of scheduling transactions such that their serializability can be guaranteed, while recovery has to restore a consistent database state after a system or media failure. Assuming that the database server is in charge of the “C,” the former guarantees the “I” in ACID, the latter the “A” and “D” properties. Transaction management has to be highly efficient, as modern transaction servers need to accommodate thousands of transactions...
The Spring Framework provides a consistent abstraction for transaction management. The Spring Framework’s declarative transaction management is made possible with Spring aspect-oriented programming (AOP), although, as the transactional aspects code comes with the Spring Framework distribution and may be used in a boilerplate fashion, AOP concepts do not generally have to be understood to make effective use of this code.
Models
Models are implemented using Jakarta Persistence. Spring Data JPA needs same implementation.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "ToscaProperty")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Data
@EqualsAndHashCode(callSuper = false)
public class JpaToscaProperty extends PfConcept implements PfAuthorative<ToscaProperty> {
private static final long serialVersionUID = 1675770231921107988L;
@EmbeddedId
@VerifyKey
@NotNull
private PfReferenceKey key;
@Column
@VerifyKey
@NotNull
private PfConceptKey type;
@Column
@NotBlank
private String description;
|
Repository
Using Spring Data JPA it needs to implement a repository.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@Repository public interface JpaToscaPropertyRepository extends JpaRepository<JpaToscaProperty, PfReferenceKey> { } |
and also it needs to implement a JUnit test
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@ExtendWith(SpringExtension.class)
@DataJpaTest
@Import(value = ParticipantPolicyParameters.class)
@TestPropertySource(locations = {"classpath:application_test.properties"})
class JpaToscaPropertyRepositoryTest {
@Autowired
private JpaToscaPropertyRepository toscaPropertyRepository;
@Test
void test() {
JpaToscaProperty toscaProperty = new JpaToscaProperty();
PfReferenceKey key = toscaProperty.getKey();
Map<String, String> metadata = new HashMap<>();
metadata.put("Key", "Value");
metadata.put("K", "V");
List<JpaToscaConstraint> constraints = new ArrayList<>();
String[] list = new String[] {"First", "Second"};
constraints.add(new JpaToscaConstraintValidValues(Stream.of(list).collect(Collectors.toList())));
toscaProperty.setDefaultValue("DefaultValue");
toscaProperty.setDescription("Description");
toscaProperty.setRequired(true);
toscaProperty.setStatus(ToscaProperty.Status.EXPERIMENTAL);
toscaProperty.setMetadata(metadata);
toscaProperty.setConstraints(constraints);
toscaPropertyRepository.save(toscaProperty);
Optional<JpaToscaProperty> opt = toscaPropertyRepository.findById(key);
assertThat(opt).isNotEmpty();
JpaToscaProperty actual = opt.get();
assertThat(actual.getDefaultValue()).isEqualTo(toscaProperty.getDefaultValue());
assertThat(actual.getDescription()).isEqualTo(toscaProperty.getDescription());
assertThat(actual.isRequired()).isEqualTo(toscaProperty.isRequired());
assertThat(actual.getStatus()).isEqualTo(toscaProperty.getStatus());
assertThat(actual.getType()).isEqualTo(toscaProperty.getType());
assertThat(actual.getConstraints()).isEqualTo(toscaProperty.getConstraints());
}
} |