object CommentTable : LongIdTable() { val comment = text("comment") val entityType = varchar("entityType", 128) val entityID = long("entityId") } class Comment(id: EntityID) : LongEntity(id) { var comment by CommentTable.comment private var entityType by CommentTable.entityType private var entityId by CommentTable.entityID companion object : LongEntityClass(CommentTable) { fun addComment(entity: CommentsAware, comment: String) = Comment.new { this.comment = comment this.entityId = entity.entityId this.entityType = entity.entityType } } } interface CommentsAware { val entityId : Long val entityType: String fun getComments() = Comment.find { CommentTable.entityType eq entityType and (CommentTable.entityID eq entityId) } } class User(id: EntityID) : LongEntity(id), CommentsAware { override val entityId: Long get() = id.value override val entityType: String = "user" }