Sponsors
|
|
|
|
Need help?
Post questions or issues to the Ebean google group - https://groups.google.com/forum/#!forum/ebean
Documentation
Maven cental links:
Maven central - all related projects
|
|
|
|
Post questions or issues to the Ebean google group - https://groups.google.com/forum/#!forum/ebean
Maven central - all related projects
I'm using Play 2.2.1, which includes ebeanorm-3.2.2 which I tested against and found (what I believe) this bug.
I am getting PersistenceExceptions thrown when creating a large set (hundreds) of similar queries in a row. It seems to depend on the data I'm passing in, which unfortunately, I cannot disclose. The queries look very similar, but have varying numbers of parameters in each section. I traced this through the ebean source code (which I repackaged and replaced the jar in my Play repo), and it lead me to believe that the hashes were colliding. I printed the computed hashes of each query, and they did indeed match. It seems that because they hash the same, the same QueryPlan object it being used for both, even though they have differing numbers of bound parameters.
Both below errors hash to the value: 1336939366
Before I knew all of this, I attempted to explain what I was seeing over on stackoverflow if you'd like to take a look at that as well. http://stackoverflow.com/questions/20501591/ebean-dynamic-query-prepared-statements-mismatched-parameter-count-error
Here are the two stack traces:
play.api.Application$$anon$1: Execution exception[[PersistenceException: Query threw SQLException:No value specified for parameter 19
Bind values:[SENT,1290,8988,13032,13052,1290,96,99,100,101,102,103,104,105,106,107,108,222]
Query was:
select distinct t0.contact_id c0, t0.contact_uuid c1, t0.bounce c2 from contact t0 join email_record u1 on u1.contact_id = t0.contact_id join contact_tag u2z_ on u2z_.contact_id = t0.contact_id join tag u2 on u2.tag_id = u2z_.tag_id where u1.status = ? and t0.unit_id = ? and u2.tag_id in (?,?) and t0.unit_id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) and t0.campaign_id in (?,?,?,?,?,?,?,?,?,?,?,?)
]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10.jar:2.2.1]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10.jar:2.2.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
at scala.Option.map(Option.scala:145) [scala-library.jar:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2.applyOrElse(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
Caused by: javax.persistence.PersistenceException: Query threw SQLException:No value specified for parameter 19
Bind values:[SENT,1290,8988,13032,13052,1290,96,99,100,101,102,103,104,105,106,107,108,222]
Query was:
select distinct t0.contact_id c0, t0.contact_uuid c1, t0.bounce c2 from contact t0 join email_record u1 on u1.contact_id = t0.contact_id join contact_tag u2z_ on u2z_.contact_id = t0.contact_id join tag u2 on u2.tag_id = u2z_.tag_id where u1.status = ? and t0.unit_id = ? and u2.tag_id in (?,?) and t0.unit_id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) and t0.campaign_id in (?,?,?,?,?,?,?,?,?,?,?,?)
at com.avaje.ebeaninternal.server.query.CQuery.createPersistenceException(CQuery.java:798) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.query.CQuery.createPersistenceException(CQuery.java:775) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.query.CQueryEngine.findMany(CQueryEngine.java:205) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.query.DefaultOrmQueryEngine.findMany(DefaultOrmQueryEngine.java:81) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.core.OrmQueryRequest.findList(OrmQueryRequest.java:265) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.core.DefaultServer.findList(DefaultServer.java:1469) ~[avaje-ebeanorm.jar:na]
Caused by: java.sql.SQLException: No value specified for parameter 19
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2612) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2587) ~[mysql-connector-java-5.1.27.jar:na]
And the second:
play.api.Application$$anon$1: Execution exception[[PersistenceException: Error with property[19] dt[4]data[1464][java.lang.Integer]]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10.jar:2.2.1]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10.jar:2.2.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
at scala.Option.map(Option.scala:145) [scala-library.jar:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2.applyOrElse(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
Caused by: javax.persistence.PersistenceException: Error with property[19] dt[4]data[1464][java.lang.Integer]
at com.avaje.ebeaninternal.server.persist.Binder.bindSimpleData(Binder.java:327) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.persist.Binder.bindObject(Binder.java:216) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.persist.Binder.bindObject(Binder.java:173) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.query.CQueryPredicates.bind(CQueryPredicates.java:152) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.query.CQuery.prepareBindExecuteQuery(CQuery.java:382) ~[avaje-ebeanorm.jar:na]
at com.avaje.ebeaninternal.server.query.CQueryEngine.findMany(CQueryEngine.java:165) ~[avaje-ebeanorm.jar:na]
Caused by: java.sql.SQLException: Parameter index out of range (19 > number of parameters, which is 18).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3814) ~[mysql-connector-java-5.1.27.jar:na]
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3796) ~[mysql-connector-java-5.1.27.jar:na]
This is affecting our production environment so we need a fix ASAP, so I'm going to attempt to fix this in the ebean source, and if I can, I'll try to submit a patch to this ticket. However, I am very unfamiliar with this code, so if someone has the time I'd really appreciate the help.
I can provide more data on request. Additionally, I submitted this bug on what I assume to be the old bug system before seeing the dates on the issues there, http://www.avaje.org/bug.html.
class Model {
String a;
@Transient
List<ModelB> list;
}
Model model = findById(1);
model.list = find(ModelB.class).select("oneField").findList();
//path -> (a,list(oneField))
jsonContext.toJson(o, generator, path)
//-> {"a":"a",list:[{"oneField":1,"twoField":null}]} should not show `twoField`
Ebean version: 7.3.1 Ebean datasource version: 1.1.1
Reproduce steps:
javax.persistence.PersistenceException: java.sql.SQLException: Interrupted getting connection from pool java.lang.InterruptedException
at com.avaje.ebeaninternal.server.core.DefaultContainer.checkDataSource(DefaultContainer.java:361)
at com.avaje.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:102)
at com.avaje.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:41)
at com.avaje.ebean.EbeanServerFactory.createInternal(EbeanServerFactory.java:108)
at com.avaje.ebean.EbeanServerFactory.create(EbeanServerFactory.java:67)
at act.db.ebean.EbeanService$2.on(EbeanService.java:61)
at act.event.EventBus.callOn(EventBus.java:134)
at act.event.EventBus.callOn(EventBus.java:155)
at act.event.EventBus.callOn(EventBus.java:171)
at act.event.EventBus.emit(EventBus.java:189)
at act.event.EventBus.emit(EventBus.java:180)
at act.app.App.emit(App.java:504)
at act.app.App.refresh(App.java:273)
at act.app.CliSession.run(CliSession.java:90)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: Interrupted getting connection from pool java.lang.InterruptedException
at org.avaje.datasource.pool.PooledConnectionQueue.getPooledConnection(PooledConnectionQueue.java:277)
at org.avaje.datasource.pool.ConnectionPool.getPooledConnection(ConnectionPool.java:712)
at org.avaje.datasource.pool.ConnectionPool.getConnection(ConnectionPool.java:700)
at com.avaje.ebeaninternal.server.core.DefaultContainer.checkDataSource(DefaultContainer.java:351)
... 20 more
Set the index of the first row of the results to return.
SqlQuery.setFirstRow(10) findList return first row index 0
如果有一张订单表, 需要将状态由已创建变更为已支付, 对应的 sql 语句是:
update t_order set status = 'Pay' where id = xxx and status = 'Create'
然后根据返回的结果是否为 1 来判断更新有没有成功, 从而决定是否将事务进行回滚.
不想使用 version 的原因在于: 如果有其他的地方在做跟 status 无关的更新操作, 这里的更新将会失败, 还是想基于这一个属性做这种颗粒度的更新, 而且从性能的角度来说, 也多了一次 load version 的查询
v = select version from t_order where id = xxx
update t_order set status = 'Pay', version = v + 1
where id = xxx and version = v
虽然也能用 createQuery 的方式完成这个实现
public void pay(Long id) {
String delete = "update t_order set status = :new and id = :id and status = :old";
SqlUpdate update = ebeanServer.createSqlUpdate(delete);
update.setParameter("id", id);
update.setParameter("old", "Create");
update.setParameter("new", "Pay");
if (update.execute() != 1) {
// rollback...
return;
}
}
但是, 在代码中嵌入 SQL, 多少还是挺难受的, 一旦表名或字段名发生变更(尽管这种情况并不多见)就难受了, 虽然可以挪到 xml, 但是在我看来那样更难受.
我的意思是, 能不能在 ebeanServer 中添加一个像下面这样的方法:
public interface EbeanServer {
...
int update(Object newBean, Object oldBean) throws OptimisticLockException;
...
}
这样一来, 调用时, 我只需要
Order order = new Order();
order.setStatus("pay");
Order old = new Order();
old.setId(id);
old.setStatus("Create");
if (ebeanServer.update(order, old) != 1) {
log...
// trigger transaction rollback or do anything with business-related operations
throw new ServiceException("change status fail. please check! order_id: {}", id);
}
当然, 可能带 where 的条件规则会很多, 不仅仅只是这么简单了. 比如
update t_order set status = 'Pay'
where id = xxx and (status = 'Create' or status = 'Confirm')
delete t_system_log where is_delete = 1 and create_time <= '3 month ago'
会有这种需求, 是因为之前我用的 mybatis, 可以用 example 轻松组装出上面的 sql 出来
Hi, unfortunately ebean-agent probably doing somthing which it should not.
given
abstract class SimpleIdentity<T : Serializable>: Identity<T>() {
final override fun equals(other: Any?) = super.equals(other)
final override fun hashCode() = super.hashCode()
}
when
fun main() {
println(Employee(1, "2", "2")==(Employee(1, "2", "2")))
}
we get
Exception in thread "main" java.lang.VerifyError: class com.example.Employee overrides final method equals.(Ljava/lang/Object;)Z
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.example.MainKt.main(main.kt:5)
at com.example.MainKt.main(main.kt)
code attached.
If we remove Entity
annotation so ebean does not modify class - it's ok.
tried with several gradle and jvm versions.
Java 1.8 does not work for sure.
or in conjunction with "exists" query
Hello @rbygrave We have found a severe bug, when using "orderBy" + "findIds"
Please take a look at my solution. I'm not sure if the change in DefaultOrmQuery::createExtraJoinsToSupportManyWhereClause is really the right place (as method name suggests something different)
Cheers Roland
It is maybe related to #2186 but the issue that I got is when I try to override values auto-generated by ebean it seems it does not read the custom column names
So the question is: how I can customize the table name? I tried something like:
So if I have:
public class Student extends Model {
@Id
@Column(name = "StudentNumber", length = 35, nullable = false, updatable = false)
private String studentNumber;
// getters, and setters
}
public class Course extends Model {
@Id
@Column(name = "Id", nullable = false, updatable = false, unique = true)
private UUID id;
@ManyToMany(cascade = CascadeType.ALL)
private List<Student> students;
// getters, and setters
}
And in Course
side I tried to do mapping like:
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CustomCourseStudent",
joinColumns = @JoinColumn(name = "CustomCourseId"),
inverseJoinColumns = @JoinColumn(name = "CustomStudentNumber")
)
private List<Student> students;
or
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CourseStudent",
joinColumns = @JoinColumn(name = "CourseId"),
inverseJoinColumns = @JoinColumn(name = "StudentNumber")
)
private List<Student> students;
Both didn't work, and it returns with error:
Caused by: javax.persistence.PersistenceException: Error with the Join on [models.Course.students]. Could not find the matching foreign key for [[Id]] in table[CourseStudent]? Perhaps using a @JoinColumn with the name/referencedColumnName attributes swapped?
at io.ebeaninternal.server.deploy.BeanPropertyAssoc.findMatch(BeanPropertyAssoc.java:613)
at io.ebeaninternal.server.deploy.BeanPropertyAssocMany.findMatch(BeanPropertyAssocMany.java:701)
at io.ebeaninternal.server.deploy.BeanPropertyAssocMany.createExported(BeanPropertyAssocMany.java:689)
at io.ebeaninternal.server.deploy.BeanPropertyAssocMany.initialiseAssocMany(BeanPropertyAssocMany.java:185)
at io.ebeaninternal.server.deploy.BeanPropertyAssocMany.initialise(BeanPropertyAssocMany.java:153)
at io.ebeaninternal.server.deploy.BeanDescriptor.initialiseOther(BeanDescriptor.java:636)
at io.ebeaninternal.server.deploy.BeanDescriptorManager.initialiseAll(BeanDescriptorManager.java:525)
at io.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:330)
at io.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:177)
at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:110)
at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:35)
at io.ebean.DatabaseFactory.createInternal(DatabaseFactory.java:123)
at io.ebean.DatabaseFactory.create(DatabaseFactory.java:77)
at play.db.ebean.orm.EbeanDynamicEvolutions.lambda$start$2(EbeanDynamicEvolutions.java:127)
at java.base/java.util.HashMap.forEach(HashMap.java:1336)
at play.db.ebean.orm.EbeanDynamicEvolutions.start(EbeanDynamicEvolutions.java:123)
at play.db.ebean.orm.EbeanDynamicEvolutions.<init>(EbeanDynamicEvolutions.java:68)
at play.db.ebean.orm.EbeanDynamicEvolutions$$FastClassByGuice$$9cd3c635.newInstance(<generated>)
The error mentions [Id]
but it should be by default TableName_IdColumnName
, the exception might get resolved in the other ticket, but still it seems when I tried to work around it, it does not read @JoinTable
?
The issue about the auto-generated intersection table name when I use ebean.default.allQuotedIdentifiers=true
and @MayToMany
relation
If I have the following models:
public class Student extends Model {
@Id
@Column(name = "StudentNumber", length = 35, nullable = false, updatable = false)
private String studentNumber;
// getters, and setters
}
public class Course extends Model {
@Id
@Column(name = "Id", nullable = false, updatable = false, unique = true)
private UUID id;
@ManyToMany(cascade = CascadeType.ALL)
private List<Student> students;
// getters, and setters
}
SQL generated:
create table [dbo].[Course]_[Student] (
[[Course]_[Id]] uniqueidentifier not null,
[[Student]_[StudentNumber]] nvarchar(35) not null,
constraint [pk_Course_Student] primary key ([[Course]_[Id]],[[Student]_[StudentNumber]])
);
Issue Effecting generated foreign keys and indexes as well.
I think generated code should be something like:
create table [dbo].[CourseStudent] (
[CourseId] uniqueidentifier not null,
[StudentStudentNumber] nvarchar(35) not null,
constraint [pk_Course_Student] primary key ([CourseId],[StudentStudentNumber])
);
Hello Rob, we found a bug in fetch-ids in conjunction with order by and joins that appends "distinct" to the query:
Order by expression "T0.ORDER_DATE" must be in the result list in this case; SQL statement:
select distinct t0.id
from o_order t0
join o_order_detail u1 on u1.order_id = t0.id where t0.id > ? and u1.id > ?
order by t0.order_date
I will do a short investigation, if I can fix this.
CustomerTest
in https://github.com/ebean-orm-examples/example-kotlin runs without exception after an IntelliJ Rebuild.
kotlin.UninitializedPropertyAccessException: lateinit property contacts has not been initialized
at org.example.domain.query.QCustomer.getContacts(QCustomer.kt:62)
at org.example.domain.CustomerTest.exampleAliasUse(CustomerTest.kt:28)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
example-kotlin
into IntelliJorg.example.domain.CustomerTest
with VM Options -javaagent:ebean-agent-12.4.1.jar=debug=3
(the same issue happens with the IntelliJ plugin)Environment:
I'm using PostgreSQL 11.7, when i generate DB migration SQL scripts, Ebean always use SQL type timestamptz for LocalDateTime even i have set @Column(columnDefinition = "timestamp")
Want to set LocalDateTime mapped to timestamp SQL type
LocalDateTime mapped to timestamptz
@Column(columnDefinition = "timestamp")
private LocalDateTime publishedOn;
// some logging output
#2181 - Oracle 9,10,11 rownum based limiting for SqlQuery and DtoQuery (rather than Oracle 12g row limiting) #2182 - Tidy javadoc - this may mean JDK 15 is required to generate javadoc #2177 - findNative not mapping bean when schema specified in entity mapping #2179 - Fetch on nested one-to-many collections results in duplicates #2180 - Improved fix for #2179 - Fetch on nested one-to-many collectio… refactor #2178 - Add more assertions for nested one-to-many fetch bug
This version removes support of string "query hints" like +query(50). I don't believe anyone will be using this very old way of specifying a join to be a query join etc. We have been using fetchQuery() etc for a while now. Removal of the query hints lead to quite a bit of refactoring of the internals to improve the efficiency of calculating the orm query plan.
#2174 - #2175 - Entity beans with @Cache + @DbArray of enums (or UUID or Integer) not converted to enums (come back as String) bug #2165 - Joda LocalDate West of UTC converts incorrectly (Fix: change from epoc millis conversion to y/m/d conversion) #2166 - Remove deprecated forUpdate(lockType) methods - migrate to withLock(lockType, waitType) deprecated-api #2168 - Using ebean-test with redis container - hanging testing redis connectivity bug
#2169 - #2170 - #2171 - Support for jakarta.validation.constraints.NotNull and jakarta.validation.constraints.Size #2173 - ebean-test: Add assertContains - DbJson.of(entityBean).assertContains(...) new-api #2130 - Ignore special kotlin collection types behaviour change
#2163 - Remove support for "query hints" like +query(50) behaviour change breaking-api #2167 - Refactor query internals to reduce property parsing for partial select and fetch #2164 - Deprecate the mutating methods of FetchConfig to migrate to the static factory methods deprecated-api #2161 - Refactor FetchConfig - add static factory methods like e.g. FetchConfig.ofQuery(50) #2159 - Improve internal calculation of orm query plan hash key (Require use of inline hints like +query(50) to be comma delimited with properties)
#2162 - Change ebean artifact such that ebean-ddl-generator is a dependency of ebean-test and ebean-autotune optional dependencies
#2157 - ManyToMany mapping to itself results in broken generated SQL DDL when not defining @JoinTable. bug #2156 - Using @OneToOne(targetEntity...) with Interface field results in BeanNotRegisteredException bug #2160 - #2156 - Using @OneToOne(targetEntity...) with Interface field results… bug #2158 - Oracle - automatic platform selection doesn't select older Oracle11Platform via jdbc metadata major version bug #2155 - QueryBeans: Change to use own @Generated with retention RUNTIME refactor #2154 - QueryBeans: TargetEntity is not evaluated during bean generation resulting in bad query beans bug #2153 - QueryBeans: OneToMany Map property is handled as PScalar instead of TQAssocBean bug #2127 - Adding a new list of children to @OneToMany with orphanRemoval true does not delete existing orphans bug #2152 - Fix to only cancel query once bug
#2149 - ADD: jdbc batch flush doesnt execute sql statements created in lifecycle methods (e.g. beans saved in PostInsert etc) bug #2147 - ADD: multiple to many outer joins cause wrong count in distinct count… bug #2148 - PersistenceException: No ScalarType registered for class java.util.LinkedHashMap bug #2146 - Cache with lazy load doesnt work bug #2145 - SoftDelete predicate missing on join to ManyToOne supporting predicate expression bug #2144 - Wrong beans in Persistcontext avoid proper lazy load bug
#2141 - Failing testcase that shows wipe of all old children on save with orphan removal (Aka revert of fix for #2127)
#2140 - Bump ebean-migration dependency of ebean-ddl-generator to 12.4.0 (update ebean-test) #2139 - Failing testcase that shows wipe of all children on save (orphan removal) #2135 - ebean does not support Spring @Transactional(propagation = Propagation.REQUIRES_NEW) #2138 - Mark Transaction.flushBatch() as deprecated - migrate to flush(); #2137 - Expected Transaction flush on SqlQuery and DtoQuery not occurring