EclipseLink / JPA2 Проблема сохранения двунаправленного каскада ManyToOne - PullRequest
2 голосов
/ 24 марта 2011

Это похоже на Как сохранить каскад, используя JPA / EclipseLink

У меня есть такие сущности. Одним из них является RoomEntity, который имеет двунаправленные отношения с ComputerEntity. например. В каждой комнате есть 0..n компьютеров.

@Entity
public class ComputerEntity implements Serializable {
    @Id
    @GeneratedValue(generator="computerSeq",strategy= GenerationType.SEQUENCE)
  @SequenceGenerator(name="computerSeq",sequenceName="SEQUENCECOMPUTERID",allocationSize=1)
    private long computerID;

    @Column(name = "COMPUTERID")
    public long getComputerID() {
        return computerID;
    }

    public void setComputerID(long computerID) {
        this.computerID = computerID;
    }

    private RoomEntity room;

    @ManyToOne()
    @JoinColumn(name = "ROOMID", referencedColumnName = "ROOMID")
    public RoomEntity getRoom() {
        return room;
    }

    public void setRoom(RoomEntity room) {
        this.room = room;
    }

} //ComputerEntity

@Entity
public class RoomEntity {

    @Id
    @GeneratedValue(generator="roomSeq",strategy= GenerationType.SEQUENCE)
    @SequenceGenerator(name="roomSeq",sequenceName="SEQUENCEROOMID",allocationSize=1)
    private long roomID;

    @OneToMany(mappedBy = "room", cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
    private Set<ComputerEntity> computers;

    @javax.persistence.Column(name = "ROOMID")
    public long getRoomID() {
        return roomID;
    }

    public void setRoomID(long roomID) {
        this.roomID = roomID;
    }

    public Set<ComputerEntity> getComputers() {
        return computers;
    }

    public void setComputers(Set<ComputerEntity> computers) {
        for(ComputerEntity computer : computers) {
            computer.setRoom(this);
        }
        this.computers = computers;
    }
}//RoomEntity

Когда я пытаюсь сохранить новую комнату с компьютером, например:

    RoomEntity room = new RoomEntity();
    room.setAdministrator("Fox Moulder");
    room.setLocation("Area 51");

    ComputerEntity computer1 = new ComputerEntity();
    computer1.setDescription("Alienware area51 laptop");
    Set<ComputerEntity> computers = new HashSet<ComputerEntity>();
    computers.add(computer1);

    room.setComputers(computers);

    roomBean.createRoom(room);

roomBean является EJB без сохранения состояния, а roomBean.createRoom просто вызывает entityManager.persist (room). Поскольку у меня есть поле CascadeType.PERSIST на поле компьютеров RoomEntity, создается ComptuerEntity. Однако, если я смотрю на поле комнаты этого ComputerEntity, я вижу, что поле комнаты пустое. Я бы предположил, что Eclipselink автоматически заполнил бы комнату, так как у меня двунаправленные отношения. Чтобы расставить комнату таким образом, мне нужно было добавить

        for(ComputerEntity computer : computers) {
            computer.setRoom(this);
        }

to room.setComputers (...). Это правильный подход или есть способ заставить Eclipselink автоматически установить это?

Спасибо. -Noah

1 Ответ

1 голос
/ 24 марта 2011

В JPA нет поддержки отношений. EJB 2.1 показал, что общее управление отношениями слишком неэффективно и громоздко.

Я рекомендую добавить метод addComputer (), который установит RoomEntity для недавно добавленного ComputerEntity

...