CORDA-1297 - revert column nullability (#4030)

* CORDA-1297 revert column nullability

* CORDA-1297 address code review comments

* CORDA-1297 address code review comments
This commit is contained in:
Tudor Malene 2018-10-04 16:30:45 +01:00 committed by Katelyn Baker
parent 322700d973
commit 64fc9009a1
29 changed files with 126 additions and 162 deletions

View File

@ -4447,19 +4447,21 @@ public class net.corda.core.schemas.PersistentState extends java.lang.Object imp
@Embeddable @Embeddable
public class net.corda.core.schemas.PersistentStateRef extends java.lang.Object implements java.io.Serializable public class net.corda.core.schemas.PersistentStateRef extends java.lang.Object implements java.io.Serializable
public <init>() public <init>()
public <init>(String, int) public <init>(String, Integer)
public <init>(net.corda.core.contracts.StateRef) public <init>(net.corda.core.contracts.StateRef)
@NotNull @Nullable
public final String component1() public final String component1()
public final int component2() @Nullable
public final Integer component2()
@NotNull @NotNull
public final net.corda.core.schemas.PersistentStateRef copy(String, int) public final net.corda.core.schemas.PersistentStateRef copy(String, Integer)
public boolean equals(Object) public boolean equals(Object)
public int getIndex() @Nullable
@NotNull public Integer getIndex()
@Nullable
public String getTxId() public String getTxId()
public int hashCode() public int hashCode()
public void setIndex(int) public void setIndex(Integer)
public void setTxId(String) public void setTxId(String)
public String toString() public String toString()
## ##

View File

@ -54,7 +54,7 @@ object CommonSchemaV1 : MappedSchema(schemaFamily = CommonSchema.javaClass, vers
/** [OwnableState] attributes */ /** [OwnableState] attributes */
/** X500Name of owner party **/ /** X500Name of owner party **/
@Column(name = "owner_name", nullable = true) @Column(name = "owner_name")
var owner: AbstractParty, var owner: AbstractParty,
/** [FungibleAsset] attributes /** [FungibleAsset] attributes
@ -64,16 +64,16 @@ object CommonSchemaV1 : MappedSchema(schemaFamily = CommonSchema.javaClass, vers
*/ */
/** Amount attributes */ /** Amount attributes */
@Column(name = "quantity", nullable = false) @Column(name = "quantity")
var quantity: Long, var quantity: Long,
/** Issuer attributes */ /** Issuer attributes */
/** X500Name of issuer party **/ /** X500Name of issuer party **/
@Column(name = "issuer_name", nullable = true) @Column(name = "issuer_name")
var issuer: AbstractParty, var issuer: AbstractParty,
@Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var issuerRef: ByteArray var issuerRef: ByteArray
) : PersistentState() ) : PersistentState()

View File

@ -57,11 +57,11 @@ open class MappedSchema(schemaFamily: Class<*>,
*/ */
@Embeddable @Embeddable
data class PersistentStateRef( data class PersistentStateRef(
@Column(name = "transaction_id", length = 64, nullable = false) @Column(name = "transaction_id", length = 64)
var txId: String, var txId: String? = null,
@Column(name = "output_index", nullable = false) @Column(name = "output_index")
var index: Int var index: Int? = null
) : Serializable { ) : Serializable {
constructor(stateRef: StateRef) : this(stateRef.txhash.bytes.toHexString(), stateRef.index) constructor(stateRef: StateRef) : this(stateRef.txhash.bytes.toHexString(), stateRef.index)
} }

View File

@ -60,12 +60,6 @@ Unreleased
* Fix CORDA-1229. Setter-based serialization was broken with generic types when the property was stored * Fix CORDA-1229. Setter-based serialization was broken with generic types when the property was stored
as the raw type, List for example. as the raw type, List for example.
* API change: ``net.corda.core.schemas.PersistentStateRef`` fields (index and txId) are now non-nullable.
The fields were always effectively non-nullable - values were set from non-nullable fields of other objects.
The class is used as database Primary Key columns of other entities and databases already impose those columns as non-nullable
(even if JPA annotation nullable=false was absent).
In case your Cordapps use this entity class to persist data in own custom tables as non Primary Key columns refer to :doc:`upgrade-notes` for upgrade instructions.
* Table name with a typo changed from ``NODE_ATTCHMENTS_CONTRACTS`` to ``NODE_ATTACHMENTS_CONTRACTS``. * Table name with a typo changed from ``NODE_ATTCHMENTS_CONTRACTS`` to ``NODE_ATTACHMENTS_CONTRACTS``.
.. _changelog_v3.2: .. _changelog_v3.2:

View File

@ -33,40 +33,6 @@ UNRELEASED
<<< Fill this in >>> <<< Fill this in >>>
* API change: ``net.corda.core.schemas.PersistentStateRef`` fields (``index`` and ``txId``) incorrectly marked as nullable are now non-nullable,
:doc:`changelog` contains the explanation.
H2 database upgrade action:
For Cordapps persisting custom entities with ``PersistentStateRef`` used as non Primary Key column, the backing table needs to be updated,
In SQL replace ``your_transaction_id``/``your_output_index`` column names with your custom names, if entity didn't used JPA ``@AttributeOverrides``
then default names are ``transaction_id`` and ``output_index``.
.. sourcecode:: sql
SELECT count(*) FROM [YOUR_PersistentState_TABLE_NAME] WHERE your_transaction_id IS NULL OR your_output_index IS NULL;
In case your table already contains rows with NULL columns, and the logic doesn't distinguish between NULL and an empty string,
all NULL column occurrences can be changed to an empty string:
.. sourcecode:: sql
UPDATE [YOUR_PersistentState_TABLE_NAME] SET your_transaction_id="" WHERE your_transaction_id IS NULL;
UPDATE [YOUR_PersistentState_TABLE_NAME] SET your_output_index="" WHERE your_output_index IS NULL;
If all rows have NON NULL ``transaction_ids`` and ``output_idx`` or you have assigned empty string values, then it's safe to update the table:
.. sourcecode:: sql
ALTER TABLE [YOUR_PersistentState_TABLE_NAME] ALTER COLUMN your_transaction_id SET NOT NULL;
ALTER TABLE [YOUR_PersistentState_TABLE_NAME] ALTER COLUMN your_output_index SET NOT NULL;
If the table already contains rows with NULL values, and the logic caters differently between NULL and an empty string,
and the logic has to be preserved you would need to create copy of ``PersistentStateRef`` class with different name and use the new class in your entity.
No action is needed for default node tables as ``PersistentStateRef`` is used as Primary Key only and the backing columns are automatically not nullable
or custom Cordapp entities using ``PersistentStateRef`` as Primary Key.
v3.1 to v3.2 v3.1 to v3.2
------------ ------------

View File

@ -26,19 +26,19 @@ object CashSchemaV1 : MappedSchema(schemaFamily = CashSchema.javaClass, version
Index(name = "pennies_idx", columnList = "pennies"))) Index(name = "pennies_idx", columnList = "pennies")))
class PersistentCashState( class PersistentCashState(
/** X500Name of owner party **/ /** X500Name of owner party **/
@Column(name = "owner_name", nullable = true) @Column(name = "owner_name")
var owner: AbstractParty, var owner: AbstractParty,
@Column(name = "pennies", nullable = false) @Column(name = "pennies")
var pennies: Long, var pennies: Long,
@Column(name = "ccy_code", length = 3, nullable = false) @Column(name = "ccy_code", length = 3)
var currency: String, var currency: String,
@Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE)
var issuerPartyHash: String, var issuerPartyHash: String,
@Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var issuerRef: ByteArray var issuerRef: ByteArray
) : PersistentState() ) : PersistentState()

View File

@ -29,29 +29,29 @@ object CommercialPaperSchemaV1 : MappedSchema(schemaFamily = CommercialPaperSche
Index(name = "maturity_index", columnList = "maturity_instant"), Index(name = "maturity_index", columnList = "maturity_instant"),
Index(name = "face_value_index", columnList = "face_value"))) Index(name = "face_value_index", columnList = "face_value")))
class PersistentCommercialPaperState( class PersistentCommercialPaperState(
@Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE)
var issuancePartyHash: String, var issuancePartyHash: String,
@Column(name = "issuance_ref", nullable = false) @Column(name = "issuance_ref")
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var issuanceRef: ByteArray, var issuanceRef: ByteArray,
@Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE)
var ownerHash: String, var ownerHash: String,
@Column(name = "maturity_instant", nullable = false) @Column(name = "maturity_instant")
var maturity: Instant, var maturity: Instant,
@Column(name = "face_value", nullable = false) @Column(name = "face_value")
var faceValue: Long, var faceValue: Long,
@Column(name = "ccy_code", length = 3, nullable = false) @Column(name = "ccy_code", length = 3)
var currency: String, var currency: String,
@Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE)
var faceValueIssuerPartyHash: String, var faceValueIssuerPartyHash: String,
@Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var faceValueIssuerRef: ByteArray var faceValueIssuerRef: ByteArray
) : PersistentState() ) : PersistentState()

View File

@ -25,19 +25,19 @@ object SampleCashSchemaV1 : MappedSchema(schemaFamily = CashSchema.javaClass, ve
indexes = arrayOf(Index(name = "ccy_code_idx1", columnList = "ccy_code"), indexes = arrayOf(Index(name = "ccy_code_idx1", columnList = "ccy_code"),
Index(name = "pennies_idx1", columnList = "pennies"))) Index(name = "pennies_idx1", columnList = "pennies")))
class PersistentCashState( class PersistentCashState(
@Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE)
var ownerHash: String, var ownerHash: String,
@Column(name = "pennies", nullable = false) @Column(name = "pennies")
var pennies: Long, var pennies: Long,
@Column(name = "ccy_code", length = 3, nullable = false) @Column(name = "ccy_code", length = 3)
var currency: String, var currency: String,
@Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "issuer_key_hash", length = MAX_HASH_HEX_SIZE)
var issuerPartyHash: String, var issuerPartyHash: String,
@Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var issuerRef: ByteArray var issuerRef: ByteArray
) : PersistentState() ) : PersistentState()

View File

@ -16,7 +16,7 @@ object SampleCashSchemaV2 : MappedSchema(schemaFamily = CashSchema.javaClass, ve
indexes = arrayOf(Index(name = "ccy_code_idx2", columnList = "ccy_code"))) indexes = arrayOf(Index(name = "ccy_code_idx2", columnList = "ccy_code")))
class PersistentCashState( class PersistentCashState(
/** product type */ /** product type */
@Column(name = "ccy_code", length = 3, nullable = false) @Column(name = "ccy_code", length = 3)
var currency: String, var currency: String,
participants: Set<AbstractParty>, participants: Set<AbstractParty>,
owner: AbstractParty, owner: AbstractParty,
@ -26,7 +26,7 @@ object SampleCashSchemaV2 : MappedSchema(schemaFamily = CashSchema.javaClass, ve
) : CommonSchemaV1.FungibleState(participants.toMutableSet(), owner, quantity, issuerParty, issuerRef.bytes) { ) : CommonSchemaV1.FungibleState(participants.toMutableSet(), owner, quantity, issuerParty, issuerRef.bytes) {
@ElementCollection @ElementCollection
@Column(name = "participants", nullable = true) @Column(name = "participants")
@CollectionTable(name="cash_states_v2_participants", joinColumns = arrayOf( @CollectionTable(name="cash_states_v2_participants", joinColumns = arrayOf(
JoinColumn(name = "output_index", referencedColumnName = "output_index"), JoinColumn(name = "output_index", referencedColumnName = "output_index"),
JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"))) JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id")))

View File

@ -26,20 +26,20 @@ object SampleCashSchemaV3 : MappedSchema(schemaFamily = CashSchema.javaClass, ve
var participants: MutableSet<AbstractParty>? = null, var participants: MutableSet<AbstractParty>? = null,
/** X500Name of owner party **/ /** X500Name of owner party **/
@Column(name = "owner_name", nullable = true) @Column(name = "owner_name")
var owner: AbstractParty, var owner: AbstractParty,
@Column(name = "pennies", nullable = false) @Column(name = "pennies")
var pennies: Long, var pennies: Long,
@Column(name = "ccy_code", length = 3, nullable = false) @Column(name = "ccy_code", length = 3)
var currency: String, var currency: String,
/** X500Name of issuer party **/ /** X500Name of issuer party **/
@Column(name = "issuer_name", nullable = true) @Column(name = "issuer_name")
var issuer: AbstractParty, var issuer: AbstractParty,
@Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var issuerRef: ByteArray var issuerRef: ByteArray
) : PersistentState() ) : PersistentState()

View File

@ -27,29 +27,29 @@ object SampleCommercialPaperSchemaV1 : MappedSchema(schemaFamily = CommercialPap
Index(name = "maturity_index", columnList = "maturity_instant"), Index(name = "maturity_index", columnList = "maturity_instant"),
Index(name = "face_value_index", columnList = "face_value"))) Index(name = "face_value_index", columnList = "face_value")))
class PersistentCommercialPaperState( class PersistentCommercialPaperState(
@Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "issuance_key_hash", length = MAX_HASH_HEX_SIZE)
var issuancePartyHash: String, var issuancePartyHash: String,
@Column(name = "issuance_ref", nullable = false) @Column(name = "issuance_ref")
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var issuanceRef: ByteArray, var issuanceRef: ByteArray,
@Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "owner_key_hash", length = MAX_HASH_HEX_SIZE)
var ownerHash: String, var ownerHash: String,
@Column(name = "maturity_instant", nullable = false) @Column(name = "maturity_instant")
var maturity: Instant, var maturity: Instant,
@Column(name = "face_value", nullable = false) @Column(name = "face_value")
var faceValue: Long, var faceValue: Long,
@Column(name = "ccy_code", length = 3, nullable = false) @Column(name = "ccy_code", length = 3)
var currency: String, var currency: String,
@Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE)
var faceValueIssuerPartyHash: String, var faceValueIssuerPartyHash: String,
@Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var faceValueIssuerRef: ByteArray var faceValueIssuerRef: ByteArray
) : PersistentState() ) : PersistentState()

View File

@ -21,16 +21,16 @@ object SampleCommercialPaperSchemaV2 : MappedSchema(schemaFamily = CommercialPap
indexes = arrayOf(Index(name = "ccy_code_index2", columnList = "ccy_code"), indexes = arrayOf(Index(name = "ccy_code_index2", columnList = "ccy_code"),
Index(name = "maturity_index2", columnList = "maturity_instant"))) Index(name = "maturity_index2", columnList = "maturity_instant")))
class PersistentCommercialPaperState( class PersistentCommercialPaperState(
@Column(name = "maturity_instant", nullable = false) @Column(name = "maturity_instant")
var maturity: Instant, var maturity: Instant,
@Column(name = "ccy_code", length = 3, nullable = false) @Column(name = "ccy_code", length = 3)
var currency: String, var currency: String,
@Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "face_value_issuer_key_hash", length = MAX_HASH_HEX_SIZE)
var faceValueIssuerPartyHash: String, var faceValueIssuerPartyHash: String,
@Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Column(name = "face_value_issuer_ref", length = MAX_ISSUER_REF_SIZE)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var faceValueIssuerRef: ByteArray, var faceValueIssuerRef: ByteArray,

View File

@ -25,25 +25,25 @@ object NodeInfoSchemaV1 : MappedSchema(
class PersistentNodeInfo( class PersistentNodeInfo(
@Id @Id
@GeneratedValue @GeneratedValue
@Column(name = "node_info_id", nullable = false) @Column(name = "node_info_id")
var id: Int, var id: Int,
@Column(name = "node_info_hash", length = 64, nullable = false) @Column(name="node_info_hash", length = 64)
val hash: String, val hash: String,
@Column(name = "addresses", nullable = false) @Column(name = "addresses")
@OneToMany(cascade = arrayOf(CascadeType.ALL), orphanRemoval = true) @OneToMany(cascade = arrayOf(CascadeType.ALL), orphanRemoval = true)
@JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__info_hosts__infos")) @JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__info_hosts__infos"))
val addresses: List<DBHostAndPort>, val addresses: List<DBHostAndPort>,
@Column(name = "legal_identities_certs", nullable = false) @Column(name = "legal_identities_certs")
@ManyToMany(cascade = arrayOf(CascadeType.ALL)) @ManyToMany(cascade = arrayOf(CascadeType.ALL))
@JoinTable(name = "node_link_nodeinfo_party", @JoinTable(name = "node_link_nodeinfo_party",
joinColumns = arrayOf(JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__link_nodeinfo_party__infos"))), joinColumns = arrayOf(JoinColumn(name = "node_info_id", foreignKey = ForeignKey(name = "FK__link_nodeinfo_party__infos"))),
inverseJoinColumns = arrayOf(JoinColumn(name = "party_name", foreignKey = ForeignKey(name = "FK__link_ni_p__info_p_cert")))) inverseJoinColumns = arrayOf(JoinColumn(name = "party_name", foreignKey = ForeignKey(name = "FK__link_ni_p__info_p_cert"))))
val legalIdentitiesAndCerts: List<DBPartyAndCertificate>, val legalIdentitiesAndCerts: List<DBPartyAndCertificate>,
@Column(name = "platform_version", nullable = false) @Column(name = "platform_version")
val platformVersion: Int, val platformVersion: Int,
/** /**
@ -51,7 +51,7 @@ object NodeInfoSchemaV1 : MappedSchema(
* Not expected to be sequential, but later versions of the registration must have higher values * Not expected to be sequential, but later versions of the registration must have higher values
* Similar to the serial number on DNS records. * Similar to the serial number on DNS records.
*/ */
@Column(name = "serial", nullable = false) @Column(name = "serial")
val serial: Long val serial: Long
) : Serializable { ) : Serializable {
fun toNodeInfo(): NodeInfo { fun toNodeInfo(): NodeInfo {
@ -69,7 +69,7 @@ object NodeInfoSchemaV1 : MappedSchema(
data class DBHostAndPort( data class DBHostAndPort(
@Id @Id
@GeneratedValue @GeneratedValue
@Column(name = "hosts_id", nullable = false) @Column(name = "hosts_id")
var id: Int, var id: Int,
val host: String? = null, val host: String? = null,
val port: Int? = null val port: Int? = null
@ -95,11 +95,11 @@ object NodeInfoSchemaV1 : MappedSchema(
@Column(name = "party_name", nullable = false) @Column(name = "party_name", nullable = false)
val name: String, val name: String,
@Column(name = "owning_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "owning_key_hash", length = MAX_HASH_HEX_SIZE)
val owningKeyHash: String, val owningKeyHash: String,
@Lob @Lob
@Column(name = "party_cert_binary", nullable = false) @Column(name = "party_cert_binary")
val partyCertBinary: ByteArray, val partyCertBinary: ByteArray,

View File

@ -114,13 +114,14 @@ class NodeSchedulerService(private val clock: CordaClock,
toPersistentEntityKey = { PersistentStateRef(it.txhash.toString(), it.index) }, toPersistentEntityKey = { PersistentStateRef(it.txhash.toString(), it.index) },
fromPersistentEntity = { fromPersistentEntity = {
//TODO null check will become obsolete after making DB/JPA columns not nullable //TODO null check will become obsolete after making DB/JPA columns not nullable
val txId = it.output.txId val txId = it.output.txId ?: throw IllegalStateException("DB returned null SecureHash transactionId")
val index = it.output.index val index = it.output.index ?: throw IllegalStateException("DB returned null SecureHash index")
Pair(StateRef(SecureHash.parse(txId), index), Pair(StateRef(SecureHash.parse(txId), index),
ScheduledStateRef(StateRef(SecureHash.parse(txId), index), it.scheduledAt)) ScheduledStateRef(StateRef(SecureHash.parse(txId), index), it.scheduledAt))
}, },
toPersistentEntity = { key: StateRef, value: ScheduledStateRef -> toPersistentEntity = { key: StateRef, value: ScheduledStateRef ->
PersistentScheduledState(PersistentStateRef(key.txhash.toString(), key.index)).apply { PersistentScheduledState().apply {
output = PersistentStateRef(key.txhash.toString(), key.index)
scheduledAt = value.scheduledAt scheduledAt = value.scheduledAt
} }
}, },
@ -151,7 +152,7 @@ class NodeSchedulerService(private val clock: CordaClock,
@javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}scheduled_states") @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}scheduled_states")
class PersistentScheduledState( class PersistentScheduledState(
@EmbeddedId @EmbeddedId
var output: PersistentStateRef, var output: PersistentStateRef = PersistentStateRef(),
@Column(name = "scheduled_at", nullable = false) @Column(name = "scheduled_at", nullable = false)
var scheduledAt: Instant = Instant.now() var scheduledAt: Instant = Instant.now()

View File

@ -69,11 +69,11 @@ class PersistentIdentityService(override val trustRoot: X509Certificate,
@javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}identities") @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}identities")
class PersistentIdentity( class PersistentIdentity(
@Id @Id
@Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE)
var publicKeyHash: String = "", var publicKeyHash: String = "",
@Lob @Lob
@Column(name = "identity_value", nullable = false) @Column(name = "identity_value")
var identity: ByteArray = ByteArray(0) var identity: ByteArray = ByteArray(0)
) : Serializable ) : Serializable
@ -81,10 +81,10 @@ class PersistentIdentityService(override val trustRoot: X509Certificate,
@javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}named_identities") @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}named_identities")
class PersistentIdentityNames( class PersistentIdentityNames(
@Id @Id
@Column(name = "name", length = 128, nullable = false) @Column(name = "name", length = 128)
var name: String = "", var name: String = "",
@Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "pk_hash", length = MAX_HASH_HEX_SIZE)
var publicKeyHash: String = "" var publicKeyHash: String = ""
) : Serializable ) : Serializable

View File

@ -33,15 +33,15 @@ class PersistentKeyManagementService(val identityService: IdentityService,
class PersistentKey( class PersistentKey(
@Id @Id
@Column(name = "public_key_hash", length = MAX_HASH_HEX_SIZE, nullable = false) @Column(name = "public_key_hash", length = MAX_HASH_HEX_SIZE)
var publicKeyHash: String, var publicKeyHash: String,
@Lob @Lob
@Column(name = "public_key", nullable = false) @Column(name = "public_key")
var publicKey: ByteArray = ByteArray(0), var publicKey: ByteArray = ByteArray(0),
@Lob @Lob
@Column(name = "private_key", nullable = false) @Column(name = "private_key")
var privateKey: ByteArray = ByteArray(0) var privateKey: ByteArray = ByteArray(0)
) : Serializable { ) : Serializable {
constructor(publicKey: PublicKey, privateKey: PrivateKey) constructor(publicKey: PublicKey, privateKey: PrivateKey)

View File

@ -202,15 +202,15 @@ class P2PMessagingClient(private val config: NodeConfiguration,
@javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}message_retry") @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}message_retry")
class RetryMessage( class RetryMessage(
@Id @Id
@Column(name = "message_id", length = 64, nullable = false) @Column(name = "message_id", length = 64)
var key: Long = 0, var key: Long = 0,
@Lob @Lob
@Column(nullable = false) @Column
var message: ByteArray = ByteArray(0), var message: ByteArray = ByteArray(0),
@Lob @Lob
@Column(nullable = false) @Column
var recipients: ByteArray = ByteArray(0) var recipients: ByteArray = ByteArray(0)
) : Serializable ) : Serializable

View File

@ -20,7 +20,7 @@ class DBCheckpointStorage : CheckpointStorage {
@javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}checkpoints") @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}checkpoints")
class DBCheckpoint( class DBCheckpoint(
@Id @Id
@Column(name = "checkpoint_id", length = 64, nullable = false) @Column(name = "checkpoint_id", length = 64)
var checkpointId: String = "", var checkpointId: String = "",
@Column(name = "checkpoint_value") @Column(name = "checkpoint_value")

View File

@ -29,10 +29,10 @@ class DBTransactionMappingStorage : StateMachineRecordedTransactionMappingStorag
@javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}transaction_mappings") @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}transaction_mappings")
class DBTransactionMapping( class DBTransactionMapping(
@Id @Id
@Column(name = "tx_id", length = 64, nullable = false) @Column(name = "tx_id", length = 64)
var txId: String = "", var txId: String = "",
@Column(name = "state_machine_run_id", length = 36, nullable = false) @Column(name = "state_machine_run_id", length = 36)
var stateMachineRunId: String = "" var stateMachineRunId: String = ""
) : Serializable ) : Serializable

View File

@ -30,11 +30,11 @@ class DBTransactionStorage(cacheSizeBytes: Long) : WritableTransactionStorage, S
@Table(name = "${NODE_DATABASE_PREFIX}transactions") @Table(name = "${NODE_DATABASE_PREFIX}transactions")
class DBTransaction( class DBTransaction(
@Id @Id
@Column(name = "tx_id", length = 64, nullable = false) @Column(name = "tx_id", length = 64)
var txId: String = "", var txId: String = "",
@Lob @Lob
@Column(name = "transaction_value", nullable = false) @Column(name = "transaction_value")
var transaction: ByteArray = ByteArray(0) var transaction: ByteArray = ByteArray(0)
) : Serializable ) : Serializable

View File

@ -75,24 +75,24 @@ class NodeAttachmentService(
indexes = arrayOf(Index(name = "att_id_idx", columnList = "att_id"))) indexes = arrayOf(Index(name = "att_id_idx", columnList = "att_id")))
class DBAttachment( class DBAttachment(
@Id @Id
@Column(name = "att_id", nullable = false) @Column(name = "att_id")
var attId: String, var attId: String,
@Column(name = "content", nullable = false) @Column(name = "content")
@Lob @Lob
var content: ByteArray, var content: ByteArray,
@Column(name = "insertion_date", nullable = false, updatable = false) @Column(name = "insertion_date", nullable = false, updatable = false)
var insertionDate: Instant = Instant.now(), var insertionDate: Instant = Instant.now(),
@Column(name = "uploader", updatable = false, nullable = true) @Column(name = "uploader", updatable = false)
var uploader: String? = null, var uploader: String? = null,
@Column(name = "filename", updatable = false, nullable = true) @Column(name = "filename", updatable = false)
var filename: String? = null, var filename: String? = null,
@ElementCollection @ElementCollection
@Column(name = "contract_class_name", nullable = false) @Column(name = "contract_class_name")
@CollectionTable(name = "${NODE_DATABASE_PREFIX}attachments_contracts", joinColumns = arrayOf( @CollectionTable(name = "${NODE_DATABASE_PREFIX}attachments_contracts", joinColumns = arrayOf(
JoinColumn(name = "att_id", referencedColumnName = "att_id")), JoinColumn(name = "att_id", referencedColumnName = "att_id")),
foreignKey = ForeignKey(name = "FK__ctr_class__attachments")) foreignKey = ForeignKey(name = "FK__ctr_class__attachments"))

View File

@ -30,10 +30,10 @@ class NodePropertiesPersistentStore(readPhysicalNodeId: () -> String, persistenc
@Table(name = "${NODE_DATABASE_PREFIX}properties") @Table(name = "${NODE_DATABASE_PREFIX}properties")
class DBNodeProperty( class DBNodeProperty(
@Id @Id
@Column(name = "property_key", nullable = false) @Column(name = "property_key")
val key: String = "", val key: String = "",
@Column(name = "property_value", nullable = true) @Column(name = "property_value")
var value: String? = "" var value: String? = ""
) : Serializable ) : Serializable
} }

View File

@ -107,8 +107,8 @@ class BFTNonValidatingNotaryService(
toPersistentEntityKey = { PersistentStateRef(it.txhash.toString(), it.index) }, toPersistentEntityKey = { PersistentStateRef(it.txhash.toString(), it.index) },
fromPersistentEntity = { fromPersistentEntity = {
//TODO null check will become obsolete after making DB/JPA columns not nullable //TODO null check will become obsolete after making DB/JPA columns not nullable
val txId = it.id.txId val txId = it.id.txId ?: throw IllegalStateException("DB returned null SecureHash transactionId")
val index = it.id.index val index = it.id.index ?: throw IllegalStateException("DB returned null SecureHash index")
Pair(StateRef(txhash = SecureHash.parse(txId), index = index), Pair(StateRef(txhash = SecureHash.parse(txId), index = index),
UniquenessProvider.ConsumingTx( UniquenessProvider.ConsumingTx(
id = SecureHash.parse(it.consumingTxHash), id = SecureHash.parse(it.consumingTxHash),

View File

@ -29,12 +29,12 @@ class PersistentUniquenessProvider : UniquenessProvider, SingletonSerializeAsTok
@MappedSuperclass @MappedSuperclass
open class PersistentUniqueness( open class PersistentUniqueness(
@EmbeddedId @EmbeddedId
var id: PersistentStateRef, var id: PersistentStateRef = PersistentStateRef(),
@Column(name = "consuming_transaction_id", nullable = false) @Column(name = "consuming_transaction_id")
var consumingTxHash: String = "", var consumingTxHash: String = "",
@Column(name = "consuming_input_index", length = 36, nullable = false) @Column(name = "consuming_input_index", length = 36)
var consumingIndex: Int = 0, var consumingIndex: Int = 0,
@Embedded @Embedded
@ -43,10 +43,10 @@ class PersistentUniquenessProvider : UniquenessProvider, SingletonSerializeAsTok
@Embeddable @Embeddable
data class PersistentParty( data class PersistentParty(
@Column(name = "requesting_party_name", nullable = false) @Column(name = "requesting_party_name")
var name: String = "", var name: String = "",
@Column(name = "requesting_party_key", length = 255, nullable = false) @Column(name = "requesting_party_key", length = 255)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var owningKey: ByteArray = ByteArray(0) var owningKey: ByteArray = ByteArray(0)
) : Serializable ) : Serializable
@ -71,7 +71,8 @@ class PersistentUniquenessProvider : UniquenessProvider, SingletonSerializeAsTok
fromPersistentEntity = { fromPersistentEntity = {
//TODO null check will become obsolete after making DB/JPA columns not nullable //TODO null check will become obsolete after making DB/JPA columns not nullable
val txId = it.id.txId val txId = it.id.txId
val index = it.id.index ?: throw IllegalStateException("DB returned null SecureHash transactionId")
val index = it.id.index ?: throw IllegalStateException("DB returned null SecureHash index")
Pair(StateRef(txhash = SecureHash.parse(txId), index = index), Pair(StateRef(txhash = SecureHash.parse(txId), index = index),
UniquenessProvider.ConsumingTx( UniquenessProvider.ConsumingTx(
id = SecureHash.parse(it.consumingTxHash), id = SecureHash.parse(it.consumingTxHash),

View File

@ -75,14 +75,14 @@ class RaftUniquenessProvider(private val transportConfiguration: NodeSSLConfigur
@Table(name = "${NODE_DATABASE_PREFIX}raft_committed_states") @Table(name = "${NODE_DATABASE_PREFIX}raft_committed_states")
class RaftState( class RaftState(
@Id @Id
@Column(name = "id", nullable = false) @Column(name = "id")
var key: String = "", var key: String = "",
@Lob @Lob
@Column(name = "state_value", nullable = false) @Column(name = "state_value")
var value: ByteArray = ByteArray(0), var value: ByteArray = ByteArray(0),
@Column(name = "state_index", nullable = false) @Column(name = "state_index")
var index: Long = 0 var index: Long = 0
) : Serializable ) : Serializable

View File

@ -18,11 +18,11 @@ class ContractUpgradeServiceImpl : ContractUpgradeService, SingletonSerializeAsT
@Table(name = "${NODE_DATABASE_PREFIX}contract_upgrades") @Table(name = "${NODE_DATABASE_PREFIX}contract_upgrades")
class DBContractUpgrade( class DBContractUpgrade(
@Id @Id
@Column(name = "state_ref", length = 96, nullable = false) @Column(name = "state_ref", length = 96)
var stateRef: String = "", var stateRef: String = "",
/** refers to the UpgradedContract class name*/ /** refers to the UpgradedContract class name*/
@Column(name = "contract_class_name", nullable = false) @Column(name = "contract_class_name")
var upgradedContractClassName: String = "" var upgradedContractClassName: String = ""
) : Serializable ) : Serializable

View File

@ -36,19 +36,19 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio
// TODO: create a distinct table to hold serialized state data (once DBTransactionStore is encrypted) // TODO: create a distinct table to hold serialized state data (once DBTransactionStore is encrypted)
/** refers to the X500Name of the notary a state is attached to */ /** refers to the X500Name of the notary a state is attached to */
@Column(name = "notary_name", nullable = false) @Column(name = "notary_name")
var notary: Party, var notary: Party,
/** references a concrete ContractState that is [QueryableState] and has a [MappedSchema] */ /** references a concrete ContractState that is [QueryableState] and has a [MappedSchema] */
@Column(name = "contract_state_class_name", nullable = false) @Column(name = "contract_state_class_name")
var contractStateClassName: String, var contractStateClassName: String,
/** state lifecycle: unconsumed, consumed */ /** state lifecycle: unconsumed, consumed */
@Column(name = "state_status", nullable = false) @Column(name = "state_status")
var stateStatus: Vault.StateStatus, var stateStatus: Vault.StateStatus,
/** refers to timestamp recorded upon entering UNCONSUMED state */ /** refers to timestamp recorded upon entering UNCONSUMED state */
@Column(name = "recorded_timestamp", nullable = false) @Column(name = "recorded_timestamp")
var recordedTime: Instant, var recordedTime: Instant,
/** refers to timestamp recorded upon entering CONSUMED state */ /** refers to timestamp recorded upon entering CONSUMED state */
@ -87,7 +87,7 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio
/** /**
* Represents a [LinearState] [UniqueIdentifier] * Represents a [LinearState] [UniqueIdentifier]
*/ */
@Column(name = "external_id", nullable = true) @Column(name = "external_id")
var externalId: String?, var externalId: String?,
@Column(name = "uuid", nullable = false) @Column(name = "uuid", nullable = false)
@ -112,13 +112,13 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio
JoinColumn(name = "output_index", referencedColumnName = "output_index"), JoinColumn(name = "output_index", referencedColumnName = "output_index"),
JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id")), JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id")),
foreignKey = ForeignKey(name = "FK__fung_st_parts__fung_st")) foreignKey = ForeignKey(name = "FK__fung_st_parts__fung_st"))
@Column(name = "participants", nullable = true) @Column(name = "participants")
var participants: MutableSet<AbstractParty>? = null, var participants: MutableSet<AbstractParty>? = null,
/** [OwnableState] attributes */ /** [OwnableState] attributes */
/** X500Name of owner party **/ /** X500Name of owner party **/
@Column(name = "owner_name", nullable = true) @Column(name = "owner_name")
var owner: AbstractParty, var owner: AbstractParty,
/** [FungibleAsset] attributes /** [FungibleAsset] attributes
@ -128,16 +128,16 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio
*/ */
/** Amount attributes */ /** Amount attributes */
@Column(name = "quantity", nullable = false) @Column(name = "quantity")
var quantity: Long, var quantity: Long,
/** Issuer attributes */ /** Issuer attributes */
/** X500Name of issuer party **/ /** X500Name of issuer party **/
@Column(name = "issuer_name", nullable = true) @Column(name = "issuer_name")
var issuer: AbstractParty, var issuer: AbstractParty,
@Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE, nullable = false) @Column(name = "issuer_ref", length = MAX_ISSUER_REF_SIZE)
@Type(type = "corda-wrapper-binary") @Type(type = "corda-wrapper-binary")
var issuerRef: ByteArray var issuerRef: ByteArray
) : PersistentState() { ) : PersistentState() {
@ -156,13 +156,13 @@ object VaultSchemaV1 : MappedSchema(schemaFamily = VaultSchema.javaClass, versio
class VaultTxnNote( class VaultTxnNote(
@Id @Id
@GeneratedValue @GeneratedValue
@Column(name = "seq_no", nullable = false) @Column(name = "seq_no")
var seqNo: Int, var seqNo: Int,
@Column(name = "transaction_id", length = 64, nullable = false) @Column(name = "transaction_id", length = 64)
var txId: String, var txId: String,
@Column(name = "note", nullable = false) @Column(name = "note")
var note: String var note: String
) : Serializable { ) : Serializable {
constructor(txId: String, note: String) : this(0, txId, note) constructor(txId: String, note: String) : this(0, txId, note)

View File

@ -33,7 +33,7 @@ object DummyLinearStateSchemaV1 : MappedSchema(schemaFamily = DummyLinearStateSc
/** /**
* UniqueIdentifier * UniqueIdentifier
*/ */
@Column(name = "external_id", nullable = true) @Column(name = "external_id")
var externalId: String?, var externalId: String?,
@Column(name = "uuid", nullable = false) @Column(name = "uuid", nullable = false)
@ -43,16 +43,16 @@ object DummyLinearStateSchemaV1 : MappedSchema(schemaFamily = DummyLinearStateSc
/** /**
* Dummy attributes * Dummy attributes
*/ */
@Column(name = "linear_string", nullable = false) @Column(name = "linear_string")
var linearString: String, var linearString: String,
@Column(name = "linear_number", nullable = false) @Column(name = "linear_number")
var linearNumber: Long, var linearNumber: Long,
@Column(name = "linear_timestamp", nullable = false) @Column(name = "linear_timestamp")
var linearTimestamp: Instant, var linearTimestamp: Instant,
@Column(name = "linear_boolean", nullable = false) @Column(name = "linear_boolean")
var linearBoolean: Boolean var linearBoolean: Boolean
) : PersistentState() ) : PersistentState()
} }

View File

@ -23,13 +23,13 @@ object DummyLinearStateSchemaV2 : MappedSchema(schemaFamily = DummyLinearStateSc
JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"))) JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id")))
override var participants: MutableSet<AbstractParty>? = null, override var participants: MutableSet<AbstractParty>? = null,
@Column(name = "linear_string", nullable = false) var linearString: String, @Column(name = "linear_string") var linearString: String,
@Column(name = "linear_number", nullable = false) var linearNumber: Long, @Column(name = "linear_number") var linearNumber: Long,
@Column(name = "linear_timestamp", nullable = false) var linearTimestamp: java.time.Instant, @Column(name = "linear_timestamp") var linearTimestamp: java.time.Instant,
@Column(name = "linear_boolean", nullable = false) var linearBoolean: Boolean, @Column(name = "linear_boolean") var linearBoolean: Boolean,
@Transient @Transient
val uid: UniqueIdentifier val uid: UniqueIdentifier