Tomcat と EclipseLink を使用しています。関連付けがデータベースに保存されているのに、エンティティ オブジェクトの対応するプロパティに値がないのはなぜですか? 私は、2 つのエンティティを作成し、トランザクションの開始時と終了時にセッターを呼び出すだけでよいと考えました。私のデータベースを見ると、すべてうまくいっていることがわかります。私の予約テーブルには、外部キーを保持する列「ユーザー」があります。残念ながら、予約時に toString() メソッドを呼び出すと、booker プロパティがまだ null のようです。何が悪かったのか?これが私の例です:
私のクラス BookerApi.java
public Booking createBooking(Integer courtNo, Date startDate, Date endDate, Integer bookerId) {
// Entity bilden
Booking booking = new Booking();
booking.setCourtNo(courtNo);
booking.setStart(startDate);
booking.setEnd(endDate);
User booker = new User();
booker.setEmail("100");
booker.setName("101");
booker.setPassword("102");
emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
booking.setBooker(booker); // set relation
em.persist(booking); // persist relation, entity a, see vogella.com/articles/JavaPersistenceAPI/article.html#example
em.persist(booker);
em.getTransaction().commit();
em.clear();
emf.close();
//System.out.println("BookerApi.createBooking() - booking (out of em-context): " + booking);
return booking;
}
更新: 要求に応じて、Booking.java のコードを次に示します。
@Entity
@Table(name="booking")
public class Booking implements Serializable {
private static final long serialVersionUID = -5077792582177235184L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
@Temporal(TemporalType.DATE)
@Column(nullable = false)
Date start;
@Temporal(TemporalType.DATE)
@Column(nullable = false)
Date end;
@Column(nullable = false)
Integer courtNo;
@OneToOne(fetch = FetchType.EAGER) // Mueller S. 105, 109
@JoinColumn(name = "user")
User booker;
public Booking(){
}
public Integer getId() {
return id;
}
public Date getStart() {
return start;
}
public void setStart(Date start) {
this.start = start;
}
public Date getEnd() {
return end;
}
public void setEnd(Date end) {
this.end = end;
}
public Integer getCourtNo() {
return courtNo;
}
public void setCourtNo(Integer courtNo) {
this.courtNo = courtNo;
}
public User getBooker() {
return booker;
}
public void setBooker(User booker) {
this.booker = booker;
}
public Integer getBookerId() {
if (getBooker() == null){
return 0;
} else {
return getBooker().getId();
}
}
public void setBookerId(Integer bookerId) {
//System.out.println("Booking.setBookerId(Integer bookerId) " + bookerId);
BookerApi api = new BookerApi();
User booker = api.readUser(bookerId);
setBooker(booker);
}
@Override
public String toString(){
String logString = "LogString Booking -" +
" id: " + getId().toString() + ";" +
" court: " + getCourtNo().toString() + ";" +
" start: " + getStart() + ";";
if (getBooker() == null){
logString += " booker: " + getBooker() + ";";
} else {
logString += " booker: - ;";
}
return logString;
}
}