Java JPA自加入问题,我如何才能只获得1级参考?

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

我有一个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
,不包含
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
关联。