CORDA-1267 - Make JPA entities non-final and Serializable. (#2899)

This commit is contained in:
Michele Sollecito 2018-03-29 12:43:42 +01:00 committed by Katelyn Baker
parent c59f3e0786
commit 5ac4c7eda7
16 changed files with 61 additions and 38 deletions

View File

@ -2822,27 +2822,27 @@ public final class net.corda.core.schemas.CommonSchemaV1 extends net.corda.core.
@javax.persistence.MappedSuperclass @net.corda.core.serialization.CordaSerializable public static class net.corda.core.schemas.CommonSchemaV1$FungibleState extends net.corda.core.schemas.PersistentState @javax.persistence.MappedSuperclass @net.corda.core.serialization.CordaSerializable public static class net.corda.core.schemas.CommonSchemaV1$FungibleState extends net.corda.core.schemas.PersistentState
public <init>() public <init>()
public <init>(Set, net.corda.core.identity.AbstractParty, long, net.corda.core.identity.AbstractParty, byte[]) public <init>(Set, net.corda.core.identity.AbstractParty, long, net.corda.core.identity.AbstractParty, byte[])
@org.jetbrains.annotations.NotNull public final net.corda.core.identity.AbstractParty getIssuer() @org.jetbrains.annotations.NotNull public net.corda.core.identity.AbstractParty getIssuer()
@org.jetbrains.annotations.NotNull public final byte[] getIssuerRef() @org.jetbrains.annotations.NotNull public byte[] getIssuerRef()
@org.jetbrains.annotations.NotNull public final net.corda.core.identity.AbstractParty getOwner() @org.jetbrains.annotations.NotNull public net.corda.core.identity.AbstractParty getOwner()
@org.jetbrains.annotations.Nullable public Set getParticipants() @org.jetbrains.annotations.Nullable public Set getParticipants()
public final long getQuantity() public long getQuantity()
public final void setIssuer(net.corda.core.identity.AbstractParty) public void setIssuer(net.corda.core.identity.AbstractParty)
public final void setIssuerRef(byte[]) public void setIssuerRef(byte[])
public final void setOwner(net.corda.core.identity.AbstractParty) public void setOwner(net.corda.core.identity.AbstractParty)
public void setParticipants(Set) public void setParticipants(Set)
public final void setQuantity(long) public void setQuantity(long)
## ##
@javax.persistence.MappedSuperclass @net.corda.core.serialization.CordaSerializable public static class net.corda.core.schemas.CommonSchemaV1$LinearState extends net.corda.core.schemas.PersistentState @javax.persistence.MappedSuperclass @net.corda.core.serialization.CordaSerializable public static class net.corda.core.schemas.CommonSchemaV1$LinearState extends net.corda.core.schemas.PersistentState
public <init>() public <init>()
public <init>(Set, String, UUID) public <init>(Set, String, UUID)
public <init>(net.corda.core.contracts.UniqueIdentifier, Set) public <init>(net.corda.core.contracts.UniqueIdentifier, Set)
@org.jetbrains.annotations.Nullable public final String getExternalId() @org.jetbrains.annotations.Nullable public String getExternalId()
@org.jetbrains.annotations.Nullable public Set getParticipants() @org.jetbrains.annotations.Nullable public Set getParticipants()
@org.jetbrains.annotations.NotNull public final UUID getUuid() @org.jetbrains.annotations.NotNull public UUID getUuid()
public final void setExternalId(String) public void setExternalId(String)
public void setParticipants(Set) public void setParticipants(Set)
public final void setUuid(UUID) public void setUuid(UUID)
## ##
public class net.corda.core.schemas.MappedSchema extends java.lang.Object public class net.corda.core.schemas.MappedSchema extends java.lang.Object
public <init>(Class, int, Iterable) public <init>(Class, int, Iterable)
@ -2854,10 +2854,10 @@ public class net.corda.core.schemas.MappedSchema extends java.lang.Object
@javax.persistence.MappedSuperclass @net.corda.core.serialization.CordaSerializable public class net.corda.core.schemas.PersistentState extends java.lang.Object implements net.corda.core.schemas.StatePersistable @javax.persistence.MappedSuperclass @net.corda.core.serialization.CordaSerializable public class net.corda.core.schemas.PersistentState extends java.lang.Object implements net.corda.core.schemas.StatePersistable
public <init>() public <init>()
public <init>(net.corda.core.schemas.PersistentStateRef) public <init>(net.corda.core.schemas.PersistentStateRef)
@org.jetbrains.annotations.Nullable public final net.corda.core.schemas.PersistentStateRef getStateRef() @org.jetbrains.annotations.Nullable public net.corda.core.schemas.PersistentStateRef getStateRef()
public final void setStateRef(net.corda.core.schemas.PersistentStateRef) public void setStateRef(net.corda.core.schemas.PersistentStateRef)
## ##
@javax.persistence.Embeddable public final class net.corda.core.schemas.PersistentStateRef extends java.lang.Object implements java.io.Serializable @javax.persistence.Embeddable public class net.corda.core.schemas.PersistentStateRef extends java.lang.Object implements java.io.Serializable
public <init>() public <init>()
public <init>(String, Integer) public <init>(String, Integer)
public <init>(net.corda.core.contracts.StateRef) public <init>(net.corda.core.contracts.StateRef)
@ -2865,18 +2865,18 @@ public class net.corda.core.schemas.MappedSchema extends java.lang.Object
@org.jetbrains.annotations.Nullable public final Integer component2() @org.jetbrains.annotations.Nullable public final Integer component2()
@org.jetbrains.annotations.NotNull public final net.corda.core.schemas.PersistentStateRef copy(String, Integer) @org.jetbrains.annotations.NotNull public final net.corda.core.schemas.PersistentStateRef copy(String, Integer)
public boolean equals(Object) public boolean equals(Object)
@org.jetbrains.annotations.Nullable public final Integer getIndex() @org.jetbrains.annotations.Nullable public Integer getIndex()
@org.jetbrains.annotations.Nullable public final String getTxId() @org.jetbrains.annotations.Nullable public String getTxId()
public int hashCode() public int hashCode()
public final void setIndex(Integer) public void setIndex(Integer)
public final void setTxId(String) public void setTxId(String)
public String toString() public String toString()
## ##
@net.corda.core.serialization.CordaSerializable public interface net.corda.core.schemas.QueryableState extends net.corda.core.contracts.ContractState @net.corda.core.serialization.CordaSerializable public interface net.corda.core.schemas.QueryableState extends net.corda.core.contracts.ContractState
@org.jetbrains.annotations.NotNull public abstract net.corda.core.schemas.PersistentState generateMappedObject(net.corda.core.schemas.MappedSchema) @org.jetbrains.annotations.NotNull public abstract net.corda.core.schemas.PersistentState generateMappedObject(net.corda.core.schemas.MappedSchema)
@org.jetbrains.annotations.NotNull public abstract Iterable supportedSchemas() @org.jetbrains.annotations.NotNull public abstract Iterable supportedSchemas()
## ##
public interface net.corda.core.schemas.StatePersistable public interface net.corda.core.schemas.StatePersistable extends java.io.Serializable
## ##
public interface net.corda.core.serialization.ClassWhitelist public interface net.corda.core.serialization.ClassWhitelist
public abstract boolean hasListed(Class) public abstract boolean hasListed(Class)

View File

@ -85,6 +85,7 @@ buildscript {
} }
dependencies { dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
classpath "net.corda.plugins:publish-utils:$gradle_plugins_version" classpath "net.corda.plugins:publish-utils:$gradle_plugins_version"
classpath "net.corda.plugins:quasar-utils:$gradle_plugins_version" classpath "net.corda.plugins:quasar-utils:$gradle_plugins_version"
@ -133,6 +134,15 @@ allprojects {
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'jacoco' apply plugin: 'jacoco'
apply plugin: 'org.owasp.dependencycheck' apply plugin: 'org.owasp.dependencycheck'
apply plugin: 'kotlin-allopen'
allOpen {
annotations(
"javax.persistence.Entity",
"javax.persistence.Embeddable",
"javax.persistence.MappedSuperclass"
)
}
dependencyCheck { dependencyCheck {
suppressionFile = '.ci/dependency-checker/suppressedLibraries.xml' suppressionFile = '.ci/dependency-checker/suppressedLibraries.xml'

View File

@ -69,4 +69,4 @@ data class PersistentStateRef(
/** /**
* Marker interface to denote a persistable Corda state entity that will always have a transaction id and index * Marker interface to denote a persistable Corda state entity that will always have a transaction id and index
*/ */
interface StatePersistable interface StatePersistable : Serializable

View File

@ -10,6 +10,7 @@ import net.corda.core.serialization.serialize
import net.corda.core.utilities.MAX_HASH_HEX_SIZE import net.corda.core.utilities.MAX_HASH_HEX_SIZE
import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.NetworkHostAndPort
import net.corda.node.services.persistence.NodePropertiesPersistentStore import net.corda.node.services.persistence.NodePropertiesPersistentStore
import java.io.Serializable
import javax.persistence.* import javax.persistence.*
object NodeInfoSchema object NodeInfoSchema
@ -52,7 +53,7 @@ object NodeInfoSchemaV1 : MappedSchema(
*/ */
@Column(name = "serial") @Column(name = "serial")
val serial: Long val serial: Long
) { ) : Serializable {
fun toNodeInfo(): NodeInfo { fun toNodeInfo(): NodeInfo {
return NodeInfo( return NodeInfo(
this.addresses.map { it.toHostAndPort() }, this.addresses.map { it.toHostAndPort() },
@ -72,7 +73,7 @@ object NodeInfoSchemaV1 : MappedSchema(
var id: Int, var id: Int,
val host: String? = null, val host: String? = null,
val port: Int? = null val port: Int? = null
) { ) : Serializable {
companion object { companion object {
fun fromHostAndPort(hostAndPort: NetworkHostAndPort) = DBHostAndPort( fun fromHostAndPort(hostAndPort: NetworkHostAndPort) = DBHostAndPort(
0, hostAndPort.host, hostAndPort.port 0, hostAndPort.host, hostAndPort.port
@ -106,7 +107,7 @@ object NodeInfoSchemaV1 : MappedSchema(
@ManyToMany(mappedBy = "legalIdentitiesAndCerts", cascade = arrayOf(CascadeType.ALL)) // ManyToMany because of distributed services. @ManyToMany(mappedBy = "legalIdentitiesAndCerts", cascade = arrayOf(CascadeType.ALL)) // ManyToMany because of distributed services.
private val persistentNodeInfos: Set<PersistentNodeInfo> = emptySet() private val persistentNodeInfos: Set<PersistentNodeInfo> = emptySet()
) { ) : Serializable {
constructor(partyAndCert: PartyAndCertificate, isMain: Boolean = false) constructor(partyAndCert: PartyAndCertificate, isMain: Boolean = false)
: this(partyAndCert.name.toString(), : this(partyAndCert.name.toString(),
partyAndCert.party.owningKey.toStringShort(), partyAndCert.party.owningKey.toStringShort(),

View File

@ -31,6 +31,7 @@ import net.corda.nodeapi.internal.persistence.CordaPersistence
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import org.apache.activemq.artemis.utils.ReusableLatch import org.apache.activemq.artemis.utils.ReusableLatch
import org.slf4j.Logger import org.slf4j.Logger
import java.io.Serializable
import java.time.Duration import java.time.Duration
import java.time.Instant import java.time.Instant
import java.util.* import java.util.*
@ -155,7 +156,7 @@ class NodeSchedulerService(private val clock: CordaClock,
@Column(name = "scheduled_at", nullable = false) @Column(name = "scheduled_at", nullable = false)
var scheduledAt: Instant = Instant.now() var scheduledAt: Instant = Instant.now()
) ) : Serializable
private class InnerState { private class InnerState {
var scheduledStatesQueue: PriorityQueue<ScheduledStateRef> = PriorityQueue({ a, b -> a.scheduledAt.compareTo(b.scheduledAt) }) var scheduledStatesQueue: PriorityQueue<ScheduledStateRef> = PriorityQueue({ a, b -> a.scheduledAt.compareTo(b.scheduledAt) })

View File

@ -16,6 +16,7 @@ import net.corda.nodeapi.internal.crypto.X509CertificateFactory
import net.corda.nodeapi.internal.crypto.X509Utilities import net.corda.nodeapi.internal.crypto.X509Utilities
import net.corda.nodeapi.internal.crypto.x509Certificates import net.corda.nodeapi.internal.crypto.x509Certificates
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import java.io.Serializable
import java.security.InvalidAlgorithmParameterException import java.security.InvalidAlgorithmParameterException
import java.security.PublicKey import java.security.PublicKey
import java.security.cert.* import java.security.cert.*
@ -74,7 +75,7 @@ class PersistentIdentityService(override val trustRoot: X509Certificate,
@Lob @Lob
@Column(name = "identity_value") @Column(name = "identity_value")
var identity: ByteArray = ByteArray(0) var identity: ByteArray = ByteArray(0)
) ) : Serializable
@Entity @Entity
@javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}named_identities") @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}named_identities")
@ -85,7 +86,7 @@ class PersistentIdentityService(override val trustRoot: X509Certificate,
@Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE) @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE)
var publicKeyHash: String = "" var publicKeyHash: String = ""
) ) : Serializable
override val caCertStore: CertStore override val caCertStore: CertStore
override val trustAnchor: TrustAnchor = TrustAnchor(trustRoot, null) override val trustAnchor: TrustAnchor = TrustAnchor(trustRoot, null)

View File

@ -9,6 +9,7 @@ import net.corda.core.utilities.MAX_HASH_HEX_SIZE
import net.corda.node.utilities.AppendOnlyPersistentMap import net.corda.node.utilities.AppendOnlyPersistentMap
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import org.bouncycastle.operator.ContentSigner import org.bouncycastle.operator.ContentSigner
import java.io.Serializable
import java.security.KeyPair import java.security.KeyPair
import java.security.PrivateKey import java.security.PrivateKey
import java.security.PublicKey import java.security.PublicKey
@ -42,7 +43,7 @@ class PersistentKeyManagementService(val identityService: IdentityService,
@Lob @Lob
@Column(name = "private_key") @Column(name = "private_key")
var privateKey: ByteArray = ByteArray(0) var privateKey: ByteArray = ByteArray(0)
) { ) : Serializable {
constructor(publicKey: PublicKey, privateKey: PrivateKey) constructor(publicKey: PublicKey, privateKey: PrivateKey)
: this(publicKey.toStringShort(), publicKey.encoded, privateKey.encoded) : this(publicKey.toStringShort(), publicKey.encoded, privateKey.encoded)
} }

View File

@ -43,6 +43,7 @@ import org.apache.activemq.artemis.api.core.client.*
import rx.Observable import rx.Observable
import rx.Subscription import rx.Subscription
import rx.subjects.PublishSubject import rx.subjects.PublishSubject
import java.io.Serializable
import java.security.PublicKey import java.security.PublicKey
import java.time.Instant import java.time.Instant
import java.util.* import java.util.*
@ -195,7 +196,7 @@ class P2PMessagingClient(private val config: NodeConfiguration,
@Column(name = "insertion_time") @Column(name = "insertion_time")
var insertionTime: Instant = Instant.now() var insertionTime: Instant = Instant.now()
) ) : Serializable
@Entity @Entity
@javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}message_retry") @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}message_retry")
@ -211,7 +212,7 @@ class P2PMessagingClient(private val config: NodeConfiguration,
@Lob @Lob
@Column @Column
var recipients: ByteArray = ByteArray(0) var recipients: ByteArray = ByteArray(0)
) ) : Serializable
fun start() { fun start() {
state.locked { state.locked {

View File

@ -5,6 +5,7 @@ import net.corda.node.services.api.Checkpoint
import net.corda.node.services.api.CheckpointStorage import net.corda.node.services.api.CheckpointStorage
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import net.corda.nodeapi.internal.persistence.currentDBSession import net.corda.nodeapi.internal.persistence.currentDBSession
import java.io.Serializable
import javax.persistence.Column import javax.persistence.Column
import javax.persistence.Entity import javax.persistence.Entity
import javax.persistence.Id import javax.persistence.Id
@ -25,7 +26,7 @@ class DBCheckpointStorage : CheckpointStorage {
@Lob @Lob
@Column(name = "checkpoint_value") @Column(name = "checkpoint_value")
var checkpoint: ByteArray = ByteArray(0) var checkpoint: ByteArray = ByteArray(0)
) ) : Serializable
override fun addCheckpoint(checkpoint: Checkpoint) { override fun addCheckpoint(checkpoint: Checkpoint) {
currentDBSession().save(DBCheckpoint().apply { currentDBSession().save(DBCheckpoint().apply {

View File

@ -11,6 +11,7 @@ import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import net.corda.nodeapi.internal.persistence.bufferUntilDatabaseCommit import net.corda.nodeapi.internal.persistence.bufferUntilDatabaseCommit
import net.corda.nodeapi.internal.persistence.wrapWithDatabaseTransaction import net.corda.nodeapi.internal.persistence.wrapWithDatabaseTransaction
import rx.subjects.PublishSubject import rx.subjects.PublishSubject
import java.io.Serializable
import java.util.* import java.util.*
import javax.annotation.concurrent.ThreadSafe import javax.annotation.concurrent.ThreadSafe
import javax.persistence.* import javax.persistence.*
@ -33,7 +34,7 @@ class DBTransactionMappingStorage : StateMachineRecordedTransactionMappingStorag
@Column(name = "state_machine_run_id", length = 36) @Column(name = "state_machine_run_id", length = 36)
var stateMachineRunId: String = "" var stateMachineRunId: String = ""
) ) : Serializable
private companion object { private companion object {
fun createMap(): AppendOnlyPersistentMap<SecureHash, StateMachineRunId, DBTransactionMapping, String> { fun createMap(): AppendOnlyPersistentMap<SecureHash, StateMachineRunId, DBTransactionMapping, String> {

View File

@ -15,6 +15,7 @@ import net.corda.nodeapi.internal.persistence.bufferUntilDatabaseCommit
import net.corda.nodeapi.internal.persistence.wrapWithDatabaseTransaction import net.corda.nodeapi.internal.persistence.wrapWithDatabaseTransaction
import rx.Observable import rx.Observable
import rx.subjects.PublishSubject import rx.subjects.PublishSubject
import java.io.Serializable
import java.util.* import java.util.*
import javax.persistence.* import javax.persistence.*
@ -35,7 +36,7 @@ class DBTransactionStorage(cacheSizeBytes: Long) : WritableTransactionStorage, S
@Lob @Lob
@Column(name = "transaction_value") @Column(name = "transaction_value")
var transaction: ByteArray = ByteArray(0) var transaction: ByteArray = ByteArray(0)
) ) : Serializable
private companion object { private companion object {
fun createTransactionsMap(maxSizeInBytes: Long) fun createTransactionsMap(maxSizeInBytes: Long)

View File

@ -9,6 +9,7 @@ import net.corda.nodeapi.internal.persistence.CordaPersistence
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import org.slf4j.Logger import org.slf4j.Logger
import rx.subjects.PublishSubject import rx.subjects.PublishSubject
import java.io.Serializable
import javax.persistence.Column import javax.persistence.Column
import javax.persistence.Entity import javax.persistence.Entity
import javax.persistence.Id import javax.persistence.Id
@ -34,7 +35,7 @@ class NodePropertiesPersistentStore(readPhysicalNodeId: () -> String, persistenc
@Column(name = "property_value") @Column(name = "property_value")
var value: String? = "" var value: String? = ""
) ) : Serializable
} }
private class FlowsDrainingModeOperationsImpl(readPhysicalNodeId: () -> String, private val persistence: CordaPersistence, logger: Logger) : FlowsDrainingModeOperations { private class FlowsDrainingModeOperationsImpl(readPhysicalNodeId: () -> String, private val persistence: CordaPersistence, logger: Logger) : FlowsDrainingModeOperations {

View File

@ -39,7 +39,7 @@ class PersistentUniquenessProvider : UniquenessProvider, SingletonSerializeAsTok
@Embedded @Embedded
var party: PersistentParty = PersistentParty() var party: PersistentParty = PersistentParty()
) ) : Serializable
@Embeddable @Embeddable
data class PersistentParty( data class PersistentParty(

View File

@ -36,6 +36,7 @@ import net.corda.nodeapi.internal.config.NodeSSLConfiguration
import net.corda.nodeapi.internal.config.SSLConfiguration import net.corda.nodeapi.internal.config.SSLConfiguration
import net.corda.nodeapi.internal.persistence.CordaPersistence import net.corda.nodeapi.internal.persistence.CordaPersistence
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import java.io.Serializable
import java.nio.file.Path import java.nio.file.Path
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
import javax.annotation.concurrent.ThreadSafe import javax.annotation.concurrent.ThreadSafe
@ -83,7 +84,7 @@ class RaftUniquenessProvider(private val transportConfiguration: NodeSSLConfigur
@Column(name = "state_index") @Column(name = "state_index")
var index: Long = 0 var index: Long = 0
) ) : Serializable
/** Directory storing the Raft log and state machine snapshots */ /** Directory storing the Raft log and state machine snapshots */
private val storagePath: Path = transportConfiguration.baseDirectory private val storagePath: Path = transportConfiguration.baseDirectory

View File

@ -6,6 +6,7 @@ import net.corda.core.node.services.ContractUpgradeService
import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.serialization.SingletonSerializeAsToken
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
import net.corda.node.utilities.PersistentMap import net.corda.node.utilities.PersistentMap
import java.io.Serializable
import javax.persistence.Column import javax.persistence.Column
import javax.persistence.Entity import javax.persistence.Entity
import javax.persistence.Id import javax.persistence.Id
@ -23,7 +24,7 @@ class ContractUpgradeServiceImpl : ContractUpgradeService, SingletonSerializeAsT
/** refers to the UpgradedContract class name*/ /** refers to the UpgradedContract class name*/
@Column(name = "contract_class_name") @Column(name = "contract_class_name")
var upgradedContractClassName: String = "" var upgradedContractClassName: String = ""
) ) : Serializable
private companion object { private companion object {
fun createContractUpgradesMap(): PersistentMap<String, String, DBContractUpgrade, String> { fun createContractUpgradesMap(): PersistentMap<String, String, DBContractUpgrade, String> {

View File

@ -20,6 +20,7 @@ import org.hibernate.annotations.Cascade
import org.hibernate.annotations.CascadeType import org.hibernate.annotations.CascadeType
import org.junit.Ignore import org.junit.Ignore
import org.junit.Test import org.junit.Test
import java.io.Serializable
import javax.persistence.* import javax.persistence.*
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertFalse import kotlin.test.assertFalse
@ -141,12 +142,13 @@ object TestSchema : MappedSchema(SchemaFamily::class.java, 1, setOf(Parent::clas
@Suppress("unused") @Suppress("unused")
@Entity @Entity
@Table(name = "Children") @Table(name = "Children")
class Child { class Child : Serializable {
@Id @Id
@GeneratedValue @GeneratedValue
@Column(name = "child_id", unique = true, nullable = false) @Column(name = "child_id", unique = true, nullable = false)
var childId: Int? = null var childId: Int? = null
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY)
@JoinColumns(JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"), JoinColumn(name = "output_index", referencedColumnName = "output_index")) @JoinColumns(JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"), JoinColumn(name = "output_index", referencedColumnName = "output_index"))
var parent: Parent? = null var parent: Parent? = null