我正在使用Ebean进行对象映射,并且我已经创建了我的SQL表
create table company (
id int auto_increment not null primary key,
name varchar(100)
);
create table employee (
id int auto_increment not null primary key,
name varchar(100) not null,
company_id int not null,
constraint foreign key (company_id) references company (id)
on delete restrict on update restrict
);
这是Ebean公司的模型
import javax.persistence.Entity;
import javax.persistence.Id;
import com.avaje.ebean.Model;
@Entity
public class Company extends Model
{
@Id
public Integer id;
public String name;
}
员工模式
@Entity
public class Employee extends Model
{
@Id
public Integer id;
public String name;
@ManyToOne
public Company company;
public static Finder<Long, Employee> find = new Finder<Long, Employee>(Long.class, Employee.class);
}
当我运行以下
时Company company = new Company();
company.name = "Microsoft";
company.save();
Employee employee = new Employee();
employee.name = "Mr John";
employee.company = company;
employee.save();
Employee mrJohn = Employee.find.where().eq("id", 1).findUnique();
System.out.println(mrJohn.company.id);
System.out.println(mrJohn.company.name);
第一个System.out.println给出1(这是分配给员工的公司的正确ID),但第二个显示为null(我预期应该具有值“Microsoft”),输出为
1
null
因此,问题是为什么只检索公司模型的ID,而不检索其他相关数据?
答案 0 :(得分:6)
您可以使用fetch()来急切地获取图表的其他部分。在这种情况下,获取公司名称,如:
Employee.find.fetch(&#34;公司&#34;&#34;名称&#34)。其中,()当量(&#34; ID&#34;,1)。.findUnique();
简短的字段访问不能被截获(除非你增强了调用者)。因此,对company.name使用字段访问意味着customer.name是一个GETFIELD操作,并且它没有被Ebean拦截,因此没有调用延迟加载(因此返回了null)。
更改为使用getter / setter意味着在调用customer.getName()时调用了延迟加载。
Java不支持属性(有getter和setter)。您可以查看其他类似Groovy和Kotlin的JVM语言。
Groovy支持属性,使用带有@CompileStatic的Groovy的示例是: https://github.com/ebean-orm/avaje-ebeanorm-examples/blob/master/e-groovy https://github.com/ebean-orm/avaje-ebeanorm-examples/blob/master/e-groovy/src/main/groovy/org/example/domain/Customer.groovy
Kotlin支持属性,例如: https://github.com/ebean-orm/avaje-ebeanorm-examples/tree/master/e-kotlin-maven
干杯,罗布。
答案 1 :(得分:1)
我今天遇到了这个问题,并且在我们访问公共变量时,我发现了它懒得取出的原因。
可以通过调用getter
属性方法来调用延迟抓取。因此,我需要使用getter
方法在模型获取数据中创建getter
。
@Entity
public class Company extends Model
{
@Id
public Integer id;
public String name;
public Integer getId() {
return id;
}
public String getName() {
return name;
}
}
然后取公司:
System.out.println(mrJohn.company.getName());