#529 - @OneToOne with @JoinColumn to non primary key throws Data conversion error

This commit is contained in:
Robin Bygrave
2016-01-19 19:46:41 +13:00
parent e7c6223799
commit d1cdbe94de
4 changed files with 76 additions and 2 deletions
@@ -101,14 +101,23 @@ public class BeanPropertyAssocOne<T> extends BeanPropertyAssoc<T> {
// no imported or exported information
} else if (!oneToOneExported) {
importedId = createImportedId(this, targetDescriptor, tableJoin);
if (importedId.isScalar()) {
// limit JoinColumn mapping to the @Id / primary key
TableJoinColumn[] columns = tableJoin.columns();
String foreignJoinColumn = columns[0].getForeignDbColumn();
String foreignIdColumn = targetDescriptor.getIdProperty().getDbColumn();
if (!foreignJoinColumn.equalsIgnoreCase(foreignIdColumn)) {
throw new PersistenceException("Mapping limitation - @OneToOne @JoinColumn needs to map to a primary key as per Issue #529 "
+ " - joining to " + foreignJoinColumn + " and not " + foreignIdColumn);
}
}
} else {
exportedProperties = createExported();
String delStmt = "delete from " + targetDescriptor.getBaseTable() + " where ";
deleteByParentIdSql = delStmt + deriveWhereParentIdSql(false);
deleteByParentIdInSql = delStmt + deriveWhereParentIdSql(true);
}
}
}
@@ -0,0 +1,21 @@
package com.avaje.tests.model.onetoone;
import com.avaje.tests.model.basic.BasicDomain;
import javax.persistence.Column;
import javax.persistence.Entity;
@Entity
public class OCompany extends BasicDomain {
@Column(length = 50, unique = true)
public String corpId;
public String getCorpId() {
return corpId;
}
public void setCorpId(String corpId) {
this.corpId = corpId;
}
}
@@ -0,0 +1,24 @@
package com.avaje.tests.model.onetoone;
import com.avaje.tests.model.basic.BasicDomain;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
@Entity
public class ORoadShowMsg extends BasicDomain {
@OneToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn()//(name = "corp_id", nullable = false, referencedColumnName = "corp_id")
public OCompany company;
public OCompany getCompany() {
return company;
}
public void setCompany(OCompany company) {
this.company = company;
}
}
@@ -0,0 +1,20 @@
package com.avaje.tests.model.onetoone;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import org.junit.Test;
public class TestOneToOneJoinColumn extends BaseTestCase {
@Test
public void test() {
ORoadShowMsg msg = new ORoadShowMsg();
OCompany company = new OCompany();
company.setCorpId("corp_id_1000000");
msg.setCompany(company);
Ebean.save(msg);
Ebean.find(ORoadShowMsg.class, msg.getId());
}
}