これは、JPA/EclipseLinkを使用して永続化をカスケードする方法に似ています
私はそのような実体をしなければなりません。1つは、ComputerEntityと1対多の双方向の関係を持つRoomEntityです。例えば。各部屋には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)を呼び出します。RoomEntityのコンピューターフィールドにCascadeType.PERSISTがあるので、ComptuerEntityが作成されます。ただし、そのComputerEntityの部屋フィールドを見ると、部屋フィールドがnullであることがわかります。私は双方向の関係にあるので、Eclipselinkが自動的に部屋を埋めると思いました。このように部屋を設定するには、追加する必要がありました
for(ComputerEntity computer : computers) {
computer.setRoom(this);
}
room.setComputers(...)に。これは正しいアプローチですか、それともEclipselinkにこれを自動的に設定させる方法はありますか?
ありがとう。-ノア