Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/.cspell/dev.dictionary.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ allprojects # part of the gradle DSL
autodetection # a feature in junit to automatically detect tests
gradlew # the gradle wrapper script
ilike # sql term meaning "case-insensitive like"
insertable # a hibernate flag on Columns/JoinColumns
jvmargs # a gradle property to set jvm arguments
lateinit # keyword in Kotlin
metaspace # a memory space in the JVM
mkdirs # gradle API to create directories
sarif # a standard for test results (https://gcc.gnu.org/wiki/SARIF)
usertype # in Hibernate, a type with a custom adapter defined by the user
Xjsr # a jvm flag to enable JSR 305 annotations
Xjsr # a jvm flag to enable JSR 305 annotations
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package com.faire.yawn.setup.entities
import com.faire.yawn.YawnEntity
import com.faire.yawn.setup.custom.SerializeAsJson
import org.hibernate.annotations.Formula
import org.hibernate.annotations.NaturalId
import java.io.Serializable
import javax.persistence.CollectionTable
import javax.persistence.Column
import javax.persistence.ElementCollection
Expand All @@ -25,10 +27,12 @@ import javax.persistence.Version
name = "books",
indexes = [
Index(name = "idx_name", columnList = "name"),
Index(name = "idx_call_number", columnList = "call_number"),
],
)
@YawnEntity
internal class Book : TimestampedEntity<Book>() {
// Only need Serializable until Hibernate is upgraded to 6+ due to https://hibernate.atlassian.net/browse/HHH-7668
internal class Book : TimestampedEntity<Book>(), Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
override lateinit var id: YawnId<Book>
Expand All @@ -41,6 +45,10 @@ internal class Book : TimestampedEntity<Book>() {
@Column
lateinit var name: String

@NaturalId
@Column(name = "call_number")
var callNumber: String? = null

@ElementCollection(targetClass = Genre::class)
@CollectionTable(name = "book_genres", joinColumns = [JoinColumn(name = "book_id")])
@Column(name = "genre")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.faire.yawn.setup.entities

import com.faire.yawn.YawnEntity
import org.hibernate.annotations.Immutable
import java.io.Serializable
import javax.persistence.Column
import javax.persistence.Embeddable
import javax.persistence.EmbeddedId
import javax.persistence.Entity
import javax.persistence.FetchType
import javax.persistence.JoinColumn
import javax.persistence.ManyToOne
import javax.persistence.Table

@Embeddable
internal data class BookCoverCompositeId(
@Column(updatable = false, nullable = false, name = "book_id")
var bookId: YawnId<Book> = YawnId(0), // Default value since Hibernate needs a no-arg constructor

@Column(updatable = false, nullable = false, name = "owner_id")
var ownerId: YawnId<Person> = YawnId(0), // Default value since Hibernate needs a no-arg constructor
) : Serializable

@Immutable
@Entity
@Table(name = "book_covers")
@YawnEntity
internal class BookCover : TimestampedEntity<BookCover>() {
@javax.persistence.Transient
override val id: YawnId<BookCover> = YawnId(0)

@EmbeddedId
lateinit var cid: BookCoverCompositeId

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "book_id", insertable = false, updatable = false)
lateinit var book: Book

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(insertable = false, updatable = false)
lateinit var owner: Person

@Column
lateinit var material: Material

@Column
var inscription: String? = null

enum class Material {
PAPER_BAG,
CLOTH,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.faire.yawn.setup.entities

import com.faire.yawn.YawnEntity
import org.hibernate.annotations.Immutable
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.persistence.JoinColumn
import javax.persistence.OneToOne
import javax.persistence.Table

@Immutable
@Entity
@Table(name = "book_cover_ranking")
@YawnEntity
internal class BookCoverRanking : TimestampedEntity<BookCoverRanking>() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
override lateinit var id: YawnId<BookCoverRanking>

@Column
var ranking: Int = 0

@Column
var judgesComments: String? = null

@OneToOne
@JoinColumn(name = "owner_id")
@JoinColumn(name = "book_id")
lateinit var bookCover: BookCover
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ internal class BookFixtures(

val lordOfTheRings = createBook(tolkien) {
name = "Lord of the Rings"
callNumber = "PR6039 .O32 L67"
genres = setOf(FANTASY, ADVENTURE)
originalLanguage = ENGLISH

Expand All @@ -57,6 +58,7 @@ internal class BookFixtures(
}
createBook(tolkien) {
name = "The Hobbit"
callNumber = "PR6039.O32 H6 1937"
genres = setOf(FANTASY, ADVENTURE)
originalLanguage = ENGLISH

Expand All @@ -79,6 +81,7 @@ internal class BookFixtures(

val hp = createBook(rowling) {
name = "Harry Potter"
callNumber = "PZ7.R79835 Har 1998"
genres = setOf(FANTASY)
originalLanguage = ENGLISH

Expand All @@ -96,6 +99,7 @@ internal class BookFixtures(

val littleMermaid = createBook(andersen) {
name = "The Little Mermaid"
callNumber = "PZ8.A542 Lit 1993"
genres = setOf(FAIRY_TALE)
originalLanguage = DANISH

Expand Down Expand Up @@ -135,13 +139,14 @@ internal class BookFixtures(
)
}

createPerson {
val paul = createPerson {
name = "Paul Duchesne"
email = EmailAddress("paul.duchesne@faire.com")
favoriteBook = lordOfTheRings
favoriteAuthor = andersen
}
createPerson {

val luan = createPerson {
name = "Luan Nico"
email = EmailAddress("luan@faire.com")
favoriteBook = hp
Expand Down Expand Up @@ -173,6 +178,38 @@ internal class BookFixtures(
ratingMonth = 1
bestSeller = hp
}

createBookRanking {
ratingYear = 1966
ratingMonth = 12
bestSeller = lordOfTheRings
}

createBookReview {
reviewer = john
reviewText = "Frodo was pretty cool."
book = lordOfTheRings
}

val lordOfTheRingsBookCover = createBookCover(lordOfTheRings, paul) {
material = BookCover.Material.CLOTH
inscription = "The Fellowship of the Ring"
}
val hpBookCover = createBookCover(hp, luan) {
material = BookCover.Material.PAPER_BAG
inscription = "Harry Potter and the Sorcerer's Stone"
}
createBookCoverRanking {
bookCover = lordOfTheRingsBookCover
ranking = 1
judgesComments = "No notes"
}

createBookCoverRanking {
bookCover = hpBookCover
ranking = 2
judgesComments = "Good construction and solid line work"
}
}
}

Expand All @@ -195,6 +232,25 @@ internal class BookFixtures(
return update(BookRanking(), setup)
}

fun createBookCover(
book: Book,
owner: Person,
setup: BookCover.() -> Unit,
): BookCover {
return update(BookCover()) {
this.cid = BookCoverCompositeId(book.id, owner.id)
setup()
}
}

fun createBookCoverRanking(setup: BookCoverRanking.() -> Unit): BookCoverRanking {
return update(BookCoverRanking(), setup)
}

fun createBookReview(setup: BookReview.() -> Unit): BookReview {
return update(BookReview(), setup)
}

fun createBook(
author: Person,
setup: Book.() -> Unit,
Expand Down Expand Up @@ -241,6 +297,9 @@ internal class BookFixtures(
BookView::class,
Person::class,
Publisher::class,
BookCover::class,
BookCoverRanking::class,
BookReview::class,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.faire.yawn.setup.entities

import com.faire.yawn.YawnEntity
import org.hibernate.annotations.Immutable
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.FetchType
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.persistence.JoinColumn
import javax.persistence.ManyToOne
import javax.persistence.Table

@Immutable
@Entity
@Table(name = "book_reviews")
@YawnEntity
internal class BookReview : TimestampedEntity<BookReview>() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
override lateinit var id: YawnId<BookReview>
protected set

@Column
var reviewText: String? = null

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn
lateinit var reviewer: Person

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "call_number", referencedColumnName = "call_number")
lateinit var book: Book
}
Loading
Loading