Как заставить OpenJPA (1.2.2) загружать комбинированный первичный ключ @ManyToOne? - PullRequest
2 голосов
/ 01 сентября 2011

у меня есть две сущности с комбинированными примарными ключами:

@Entity
@IdClass(APK.class)
public class A {
    @Id
    Integer pk1;

    @Id
    Integer pk2;

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER,mappedBy="a")
    List<B> b = new ArrayList<B>();

    String name;
    ...
}

@Entity
@IdClass(BPK.class)
public class B {
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "pk1", referencedColumnName = "pk1"),
        @JoinColumn(name = "pk2", referencedColumnName = "pk2")
    })
    @Id 
    private A a;

    @Id
    Integer additional_key_part;

}

Когда я загружаю класс «A», список загружается правильно с нетерпением, проблема в том, что он не работает, когда я загружаюкласс "B".

Класс "B" будет правильно использовать соединение с A, но будут заполнены только поля PK поля A (pk1, pk2), а не остальные.

Настоящая проблема возникает, когда объект отправляется клиенту, у которого нет транзакции, поэтому отложенная загрузка невозможна.Единственное, что, похоже, работает, - это вызвать a.getName () или что-то еще, чтобы запустить отложенную загрузку перед закрытием транзакции, но это не совсем правильный способ.

Итак, как убедиться, что объекти все его дочерние элементы загружены?

1 Ответ

1 голос
/ 07 сентября 2011

Попробуйте изменить аннотации на следующие:

@Entity
@IdClass(ClassBPK.class)
public class ClassB {

    @Id
    private Integer pk1;
    @Id
    private Integer pk2;

    @ManyToOne(fetch = FetchType.EAGER)
    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name = "pk1", referencedColumnName = "pk1"),
        @PrimaryKeyJoinColumn(name = "pk2", referencedColumnName = "pk2")
    })
    private ClassA a;

    @Id
    private Integer pk3;

    //...
}

Я запускаю быструю проверку OpenJPA 1.2.2 с Derby с черновым классом DAO:

logger.debug("Pre find");
ClassB b = bDAOBean.findById(bId);
logger.debug("Post find");
logger.debug("A's name: {}", b.getA().getName());

и я получил:

[DEBUG] Pre find 
[INFO ] openjpa.Runtime - Starting OpenJPA 1.2.2 {main}
// ... Here comes SQL from loading the entity
[DEBUG] Post-find
[DEBUG] A's name: nameA11

Между последними двумя строками журнала нет журналов OpenJPA, поэтому он доказывает, что весь ClassA был загружен с нетерпением.

...