diff --git a/ebean-querybean/src/test/java/org/example/domain/BaseModel.java b/ebean-querybean/src/test/java/org/example/domain/BaseModel.java
index 593aa1ce4..211d3141c 100644
--- a/ebean-querybean/src/test/java/org/example/domain/BaseModel.java
+++ b/ebean-querybean/src/test/java/org/example/domain/BaseModel.java
@@ -1,8 +1,8 @@
package org.example.domain;
import io.ebean.Model;
-import io.ebean.annotation.CreatedTimestamp;
-import io.ebean.annotation.UpdatedTimestamp;
+import io.ebean.annotation.WhenCreated;
+import io.ebean.annotation.WhenModified;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@@ -11,10 +11,10 @@ import java.sql.Timestamp;
/**
* Base domain object with Id, version, whenCreated and whenUpdated.
- *
+ *
*
* Extending Model to enable the 'active record' style.
- *
+ *
*
* whenCreated and whenUpdated are generally useful for maintaining external search services (like
* elasticsearch) and audit.
@@ -28,10 +28,10 @@ public abstract class BaseModel extends Model {
@Version
Long version;
- @CreatedTimestamp
+ @WhenCreated
Timestamp whenCreated;
- @UpdatedTimestamp
+ @WhenModified
Timestamp whenUpdated;
public Long getId() {
diff --git a/ebean-querybean/src/test/java/org/example/domain/Contact.java b/ebean-querybean/src/test/java/org/example/domain/Contact.java
index e47f66248..00035d80a 100644
--- a/ebean-querybean/src/test/java/org/example/domain/Contact.java
+++ b/ebean-querybean/src/test/java/org/example/domain/Contact.java
@@ -2,13 +2,10 @@ package org.example.domain;
import io.ebean.annotation.DbArray;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
+import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* Contact entity bean.
@@ -22,28 +19,32 @@ public class Contact extends BaseModel {
@Column(length=50)
String firstName;
-
+
@Column(length=50)
String lastName;
-
+
@Column(length=200)
String email;
@Column(length=20)
String phone;
-
+
@ManyToOne(optional=false)
Customer customer;
@OneToMany(mappedBy = "contact")
List notes;
+ @OneToMany(cascade = CascadeType.PERSIST)
+ @MapKey(name="key")
+ Map others;
+
/**
* Default constructor.
*/
public Contact() {
}
-
+
/**
* Construct with a firstName and lastName.
*/
@@ -51,7 +52,7 @@ public class Contact extends BaseModel {
this.firstName = firstName;
this.lastName = lastName;
}
-
+
public String getFirstName() {
return firstName;
}
diff --git a/ebean-querybean/src/test/java/org/example/domain/ContactOther.java b/ebean-querybean/src/test/java/org/example/domain/ContactOther.java
new file mode 100644
index 000000000..731def6d6
--- /dev/null
+++ b/ebean-querybean/src/test/java/org/example/domain/ContactOther.java
@@ -0,0 +1,32 @@
+package org.example.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * Contact entity bean.
+ */
+@Entity
+@Table(name="be_contact_other")
+public class ContactOther extends BaseModel {
+
+ String key;
+
+ int something;
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public int getSomething() {
+ return something;
+ }
+
+ public void setSomething(int something) {
+ this.something = something;
+ }
+}
diff --git a/ebean-querybean/src/test/java/org/querytest/QContactTest.java b/ebean-querybean/src/test/java/org/querytest/QContactTest.java
new file mode 100644
index 000000000..ff37f789e
--- /dev/null
+++ b/ebean-querybean/src/test/java/org/querytest/QContactTest.java
@@ -0,0 +1,15 @@
+package org.querytest;
+
+import org.example.domain.query.QContact;
+import org.junit.Test;
+
+public class QContactTest {
+
+ @Test
+ public void test_oneToManyMap() {
+
+ new QContact()
+ .others.fetch()
+ .findList();
+ }
+}
diff --git a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java
index 327f67746..dc045bcf6 100644
--- a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java
+++ b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java
@@ -330,6 +330,15 @@ class ProcessingContext implements Constants {
}
}
}
+ } else if (typeArguments.size() == 2) {
+ TypeMirror argType = typeArguments.get(1);
+ if (argType.getKind() == TypeKind.WILDCARD) {
+ argType = ((WildcardType) argType).getExtendsBound();
+ }
+ Element argElement = typeUtils.asElement(argType);
+ if (isEntityOrEmbedded(argElement)) {
+ return createPropertyTypeAssoc(typeDef(argElement.asType()));
+ }
}
}
diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java
index faec817bf..6e41747d0 100644
--- a/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java
+++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java
@@ -341,6 +341,11 @@ class ProcessingContext implements Constants {
}
}
}
+ } else if (typeArguments.size() == 2) {
+ Element argElement = typeUtils.asElement(typeArguments.get(1));
+ if (isEntityOrEmbedded(argElement)) {
+ return createPropertyTypeAssoc(typeDef(argElement.asType()));
+ }
}
return null;
}