Java JPA自加入问题,我如何才能只获得1级参考?
我有一个Person表,其列名为CREATEBY。它的参考列是个人ID 我怎样才能只获得一级参考 此人:Java JPA自加入问题,我如何才能只获得1级参考?,java,ebean,Java,Ebean,我有一个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(n
@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
,不包含createby
字段的DTO
在
Person
中,将createby
字段更改为private personwithout由createby创建代码>。然后将Person
转移到视图中。如果将fetch=fetchType.LAZY
和optional=false
添加到@OneToOne
关联中会发生什么?我尝试过,但没有成功。当jackson序列化person对象时,它将调用GETTER方法。这意味着测试与find
在同一事务中。能否将@Transactional(propagation=propagation.NOT_SUPPORTED)
添加到test()方法中?您需要能够将p
对象从持久性上下文中“分离”。您好,DuncanKinnear,感谢您的快速发布。发送方式也不起作用。假设它能工作,那么第1层也不会被查询。是的,对EBean工作原理的快速研究告诉我,它没有会话,因此对象不会分离。这就是使用那些“让事情变得简单”的框架的问题——你会对它们的工作失去一定程度的控制。因此,看起来您可能不得不采用@JsonIgnore
方式与@OneToOne
关联。