我有一个Person表,其中的列名为CREATEBY。它的参考列是人的ID。
我如何只获得第一级参考?
这是人:
@Entity
@Table(name = "person")
public class Person {
@Id
private int id;
@Column(name = "cname")
private String cname;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "createby", referencedColumnName="id")
private Person createby;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Person getCreateby() {
return createby;
}
public void setCreateby(Person createby) {
this.createby = createby;
}
@Override
public String toString() {
return "Person [id=" + id + ", cname=" + cname + ", createby="
+ createby + "]";
}
}
这是测试用例
public class SelfJoinTest extends ExampleBaseTestCase {
@Before
public void before() {
Person p1 = new Person();
p1.setId(1);
p1.setCname("p1");
Person p2 = new Person();
p2.setId(2);
p2.setCname("p2");
p2.setCreateby(p1);
Person p3 = new Person();
p3.setId(3);
p3.setCname("p3");
p3.setCreateby(p2);
Ebean.save(p1);
Ebean.save(p2);
Ebean.save(p3);
}
@Test
public void test() {
Person p = Ebean.find(Person.class, 3);
System.out.println(p);
// jackson
ObjectMapper mapper = new ObjectMapper();
try {
String s = mapper.writeValueAsString(p);
System.out.println(s);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
某处说使用Jackson注释来解决它,但是我认为这不是最好的方法。这种方式浪费了许多数据库查询。 JPA对此有解决方案吗?
最佳答案
我现在有解决方案。而且我意识到JPA不应处理这种情况,甚至也不应该处理杰克逊。我的模式有问题。
作为问题的POJO,我应该在视图模式中使用开放式会话,但这不适合我。
因此,我创建了一个名为PersonWithoutCreateby
的DTO,它不包含createby
字段。
在Person
中,createby
字段更改为private PersonWithoutCreateby createby;
。并传送Person
进行查看。