Open daniel-reinhold opened 2 years ago
Same issue here. In fact, if I write client.feature_toggles == null
, IntelliJ (and my gradle build) warns me that Condition 'client.feature_toggles == null' is always 'false'
, yet at runtime, client.feature_toggles == null
evaluates to true
. That sounds like a bug to me.
Did some more troubleshooting. Looks like the association is only available in the transaction.
fun getClient(id: Int) = transaction(db) {
Client.findById(id)!!.also {
println("inside transaction:")
println(it.feature_toggles == null)
}
}.also {
println("after transaction")
println(it.feature_toggles == null)
}
The above outputs:
inside transaction:
false
after transaction
true
I can only assume this is not the desired behaviour?
@orangethunder @daniel-reinhold
Basically, Accessing Entity (Create, Read) must be done inside Transaction.
This is because LAZY is basically mapped to relationship. If you change this to EAGER, it's probably not null outside of the transaction.
But this is not recommended. It is more effective to JOIN each query than this.
@heli-os, it behaves this way even if I change it to Client.findById(id)!!.load(Client::feature_toggles)
.
I did some more googling and it turns out it's a design limitation, see https://github.com/JetBrains/Exposed/issues/656#issuecomment-542113164. So I think this issue can be closed, but perhaps it would be better if an exception is thrown when trying to access an association outside of a transaction, rather than just returning null.
Just a guess. Can you make sure the User table has one row and that row has a UserPermission referenced, and then try again?
I have two tables:
User:
UserPermissions:
Now, when I query a User (e.G. UserEntity.findById(1)) and want to access the permissions, I get following exception:
What is the problem? I don't think that I missconfigured anything. Is it a bug?