我有一个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进行查看。

09-27 17:49