Skip to content

Commit 25fc3ba

Browse files
JsonbTransient
Signed-off-by: Anders Swanson <anders.swanson@oracle.com>
1 parent c889ffe commit 25fc3ba

File tree

9 files changed

+114
-81
lines changed

9 files changed

+114
-81
lines changed

database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/Annotations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ static String getNestedViewName(Class<?> javaType,
6464
return getTableName(javaType, tableAnnotation).toLowerCase();
6565
}
6666

67-
static String getViewName(Class<?> javaType, JsonRelationalDualityView dvAnnotation) {
67+
public static String getViewName(Class<?> javaType, JsonRelationalDualityView dvAnnotation) {
6868
Table tableAnnotation = javaType.getAnnotation(Table.class);
6969
final String suffix = "_dv";
7070
if (dvAnnotation != null && StringUtils.hasText(dvAnnotation.name())) {

database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/JsonRelationalDualityClient.java

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,18 @@
33

44
package com.oracle.spring.json.duality;
55

6+
import java.util.Optional;
7+
8+
import com.oracle.spring.json.duality.annotation.JsonRelationalDualityView;
69
import com.oracle.spring.json.jsonb.JSONB;
10+
import com.oracle.spring.json.jsonb.JSONBRowMapper;
11+
import oracle.jdbc.OracleTypes;
712
import org.springframework.jdbc.core.simple.JdbcClient;
13+
import org.springframework.stereotype.Component;
14+
15+
import static com.oracle.spring.json.duality.builder.Annotations.getViewName;
816

17+
@Component
918
public class JsonRelationalDualityClient {
1019
private final JdbcClient jdbcClient;
1120
private final JSONB jsonb;
@@ -15,16 +24,29 @@ public JsonRelationalDualityClient(JdbcClient jdbcClient, JSONB jsonb) {
1524
this.jsonb = jsonb;
1625
}
1726

18-
public <T> T save(T entity) {
27+
public <T> int save(T entity, Class<T> entityJavaType) {
28+
String viewName = getViewName(entityJavaType, entityJavaType.getAnnotation(JsonRelationalDualityView.class));
29+
final String sql = """
30+
insert into %s (data) values(?)
31+
""".formatted(viewName);
32+
1933
byte[] oson = jsonb.toOSON(entity);
34+
return jdbcClient.sql(sql)
35+
.param(1, oson, OracleTypes.JSON)
36+
.update();
37+
}
2038

39+
public <T, ID> Optional<T> findById(Class<T> entityJavaType, ID id) {
40+
String viewName = getViewName(entityJavaType, entityJavaType.getAnnotation(JsonRelationalDualityView.class));
2141
final String sql = """
22-
23-
""";
24-
return null;
25-
}
42+
select * from %s dv
43+
where dv.data."_id" = ?
44+
""".formatted(viewName);
2645

27-
public <T, ID> T findById(Class<T> entityJavaType, ID id) {
28-
return null;
46+
JSONBRowMapper<T> rowMapper = new JSONBRowMapper<>(jsonb, entityJavaType);
47+
return jdbcClient.sql(sql)
48+
.param(1, id)
49+
.query(rowMapper)
50+
.optional();
2951
}
3052
}

database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/SpringBootDualityTest.java

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,16 @@
88
import java.nio.file.Files;
99
import java.nio.file.Path;
1010
import java.time.Duration;
11+
import java.util.Optional;
12+
import java.util.Set;
13+
import java.util.UUID;
1114

1215
import com.oracle.spring.json.duality.builder.DualityViewScanner;
16+
import com.oracle.spring.json.duality.model.movie.Actor;
17+
import com.oracle.spring.json.duality.model.movie.Director;
18+
import com.oracle.spring.json.duality.model.movie.DirectorBio;
19+
import com.oracle.spring.json.duality.model.movie.Movie;
20+
import com.oracle.spring.json.duality.model.student.Student;
1321
import org.junit.jupiter.api.Test;
1422
import org.springframework.beans.factory.annotation.Autowired;
1523
import org.springframework.boot.test.context.SpringBootTest;
@@ -19,6 +27,8 @@
1927
import org.testcontainers.junit.jupiter.Testcontainers;
2028
import org.testcontainers.oracle.OracleContainer;
2129

30+
import static org.assertj.core.api.Assertions.assertThat;
31+
2232
@SpringBootTest
2333
@Testcontainers
2434
public class SpringBootDualityTest {
@@ -44,6 +54,50 @@ public static String readViewFile(String fileName) {
4454
@Autowired
4555
private DualityViewScanner dualityViewScanner;
4656

57+
@Autowired
58+
JsonRelationalDualityClient dvClient;
59+
60+
@Test
61+
void student() {
62+
Student s = new Student();
63+
s.setId(UUID.randomUUID().toString());
64+
s.setFirstName("John");
65+
s.setLastName("Doe");
66+
s.setCredits(87);
67+
s.setEmail("johndoe@example.com");
68+
s.setGpa(3.77);
69+
s.setMajor("Computer Science");
70+
71+
int save = dvClient.save(s, Student.class);
72+
assertThat(save).isEqualTo(1);
73+
Optional<Student> byId = dvClient.findById(Student.class, s.getId());
74+
assertThat(byId.isPresent()).isTrue();
75+
assertThat(byId.get()).isEqualTo(s);
76+
}
77+
4778
@Test
48-
void contextLoads() {}
79+
void actor() {
80+
DirectorBio directorBio = new DirectorBio();
81+
directorBio.setBiography("biography");
82+
83+
Director director = new Director();
84+
director.setDirectorBio(directorBio);
85+
director.setFirstName("John");
86+
director.setLastName("Doe");
87+
88+
Movie m = new Movie();
89+
m.setDirector(director);
90+
m.setTitle("my movie");
91+
m.setGenre("action");
92+
m.setReleaseYear(1993);
93+
94+
Actor actor = new Actor();
95+
actor.setFirstName("John");
96+
actor.setLastName("Doe");
97+
actor.setMovies(Set.of(m));
98+
99+
dvClient.save(actor, Actor.class);
100+
Optional<Actor> actorById = dvClient.findById(Actor.class, 1);
101+
assertThat(actorById.isPresent()).isTrue();
102+
}
49103
}

database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/builder/DualityViewBuilderTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.util.stream.Stream;
77

88
import com.oracle.spring.json.duality.model.movie.Actor;
9+
import com.oracle.spring.json.duality.model.movie.Director;
10+
import com.oracle.spring.json.duality.model.movie.Movie;
911
import com.oracle.spring.json.duality.model.student.Student;
1012
import org.jetbrains.annotations.NotNull;
1113
import org.junit.jupiter.params.ParameterizedTest;
@@ -32,7 +34,6 @@ public void buildViews(Class<?> entity, String viewFile, String ddlAuto) {
3234
String expectedView = readViewFile(viewFile);
3335
DualityViewBuilder dualityViewBuilder = getDualityViewBuilder(ddlAuto);
3436
String actualView = dualityViewBuilder.build(entity);
35-
System.out.println(actualView);
3637
assertThat(expectedView).isEqualTo(actualView);
3738
}
3839

database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/model/movie/Director.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.Set;
88

99
import com.oracle.spring.json.duality.annotation.JsonRelationalDualityView;
10+
import jakarta.json.bind.annotation.JsonbProperty;
11+
import jakarta.json.bind.annotation.JsonbTransient;
1012
import jakarta.persistence.CascadeType;
1113
import jakarta.persistence.Column;
1214
import jakarta.persistence.Entity;
@@ -20,11 +22,14 @@
2022
import lombok.Getter;
2123
import lombok.Setter;
2224

25+
import static com.oracle.spring.json.duality.builder.Annotations._ID_FIELD;
26+
2327
@Entity
2428
@Table(name = "director")
2529
@Getter
2630
@Setter
2731
public class Director {
32+
@JsonbProperty(_ID_FIELD)
2833
@Id
2934
@GeneratedValue(strategy = GenerationType.IDENTITY)
3035
@Column(name = "director_id")
@@ -36,7 +41,7 @@ public class Director {
3641
@Column(name = "last_name", nullable = false, length = 50)
3742
private String lastName;
3843

39-
@JsonRelationalDualityView
44+
@JsonbTransient
4045
@OneToMany(mappedBy = "director") // Reference related entity's associated field
4146
private Set<Movie> movies;
4247

database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/model/movie/DirectorBio.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
import java.util.Objects;
77

8+
import jakarta.json.bind.annotation.JsonbProperty;
9+
import jakarta.json.bind.annotation.JsonbTransient;
810
import jakarta.persistence.Column;
911
import jakarta.persistence.Entity;
1012
import jakarta.persistence.FetchType;
@@ -16,12 +18,14 @@
1618
import lombok.Getter;
1719
import lombok.Setter;
1820

21+
import static com.oracle.spring.json.duality.builder.Annotations._ID_FIELD;
22+
1923
@Entity
2024
@Table(name = "director_bio")
2125
@Getter
2226
@Setter
2327
public class DirectorBio {
24-
28+
@JsonbProperty(_ID_FIELD)
2529
@Id
2630
@Column(name = "director_id")
2731
private Long directorId;
@@ -30,6 +34,7 @@ public class DirectorBio {
3034
// The primary key will be copied from the director entity
3135
@MapsId
3236
@JoinColumn(name = "director_id")
37+
@JsonbTransient
3338
private Director director;
3439

3540
@Column(name = "biography", columnDefinition = "CLOB")

database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/model/movie/Movie.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.Set;
88

99
import com.oracle.spring.json.duality.annotation.JsonRelationalDualityView;
10+
import jakarta.json.bind.annotation.JsonbProperty;
11+
import jakarta.json.bind.annotation.JsonbTransient;
1012
import jakarta.persistence.Column;
1113
import jakarta.persistence.Entity;
1214
import jakarta.persistence.GeneratedValue;
@@ -20,6 +22,8 @@
2022
import lombok.Getter;
2123
import lombok.Setter;
2224

25+
import static com.oracle.spring.json.duality.builder.Annotations._ID_FIELD;
26+
2327
@Entity
2428
@Table(name = "movie")
2529
@Getter
@@ -28,6 +32,7 @@ public class Movie {
2832
@Id
2933
@GeneratedValue(strategy = GenerationType.IDENTITY)
3034
@Column(name = "movie_id")
35+
@JsonbProperty(_ID_FIELD)
3136
private Long movieId;
3237

3338
@Column(name = "title", nullable = false, length = 100)
@@ -45,7 +50,7 @@ public class Movie {
4550
private Director director;
4651

4752
@ManyToMany
48-
@JsonRelationalDualityView
53+
@JsonbTransient
4954
@JoinTable(
5055
name = "movie_actor",
5156
joinColumns = @JoinColumn(name = "movie_id"),

database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/model/student/Student.java

Lines changed: 6 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import jakarta.persistence.GenerationType;
1313
import jakarta.persistence.Id;
1414
import jakarta.persistence.Table;
15+
import lombok.EqualsAndHashCode;
16+
import lombok.Getter;
17+
import lombok.Setter;
1518

1619
import static com.oracle.spring.json.duality.builder.Annotations._ID_FIELD;
1720

@@ -24,6 +27,9 @@
2427
delete = true
2528
)
2629
)
30+
@EqualsAndHashCode
31+
@Getter
32+
@Setter
2733
public class Student {
2834
@JsonbProperty(_ID_FIELD)
2935
@Id
@@ -39,69 +45,4 @@ public class Student {
3945
private double gpa;
4046

4147
public Student() {}
42-
43-
public Student(String firstName, String lastName, String email, String major, double credits, double gpa) {
44-
this.firstName = firstName;
45-
this.lastName = lastName;
46-
this.email = email;
47-
this.major = major;
48-
this.credits = credits;
49-
this.gpa = gpa;
50-
}
51-
52-
public String getId() {
53-
return id;
54-
}
55-
56-
public void setId(String id) {
57-
this.id = id;
58-
}
59-
60-
public String getFirstName() {
61-
return firstName;
62-
}
63-
64-
public void setFirstName(String firstName) {
65-
this.firstName = firstName;
66-
}
67-
68-
public String getLastName() {
69-
return lastName;
70-
}
71-
72-
public void setLastName(String lastName) {
73-
this.lastName = lastName;
74-
}
75-
76-
public String getEmail() {
77-
return email;
78-
}
79-
80-
public void setEmail(String email) {
81-
this.email = email;
82-
}
83-
84-
public String getMajor() {
85-
return major;
86-
}
87-
88-
public void setMajor(String major) {
89-
this.major = major;
90-
}
91-
92-
public double getCredits() {
93-
return credits;
94-
}
95-
96-
public void setCredits(double credits) {
97-
this.credits = credits;
98-
}
99-
100-
public double getGpa() {
101-
return gpa;
102-
}
103-
104-
public void setGpa(double gpa) {
105-
this.gpa = gpa;
106-
}
10748
}

database/starters/oracle-spring-boot-json-relational-duality-views/src/test/resources/views/actor-create.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ create force editionable json relational duality view actor_dv as actor {
66
movie_id
77
actor_id
88
movie : movie {
9-
movieId : movie_id
9+
_id : movie_id
1010
title
1111
releaseYear : release_year
1212
genre
1313
director : director {
14-
directorId : director_id
14+
_id : director_id
1515
firstName : first_name
1616
lastName : last_name
1717
director_bio : director_bio {
18-
directorId : director_id
18+
_id : director_id
1919
biography
2020
}
2121
}

0 commit comments

Comments
 (0)