2013-02-08 59 views
2

你將如何實現其中的抽象超A有2子類,B型號和C B具有與其他類X.休眠加入子類具有一對多映射

我一個雙向一個一對多的關係我正在使用沒有鑑別器和anotaions(無xml)的聯合子類映射。 它的工作原理幾乎完美,但來自B的ID在X類中爲null。 X類可以從超類中獲取ID嗎?抑或是尋找一個ID在B.

超類

import javax.persistence.*; 

import org.hibernate.annotations.Cascade; 

@Entity 
@Table(name="t_trip") 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Trip { 
@Id 
@GeneratedValue(strategy= GenerationType.IDENTITY) 
private int id; 
private String name; 
private boolean publicTrip; 
private String description; 

public Trip(){ 

} 

public Trip(String name, String description, boolean publicTrip) { 
    this.name = name; 
    this.description = description; 
    this.publicTrip = publicTrip; 
} 
} 

子類乙

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import javax.persistence.*; 
import org.hibernate.annotations.Cascade; 
@Entity 
@Table(name = "t_repeatedtrip") 
@PrimaryKeyJoinColumn(name = "id") 
public class RepeatedTrip extends Trip { 
private Date startMoment; 
private String intervalType; 
private int tripInterval; 
private int tripFrequency; 
@OneToMany(mappedBy = "repeatedTrip") 
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) 
private List<TripExecutionMoment> tripExecutionMoments = new ArrayList<TripExecutionMoment>(); 

public RepeatedTrip() { 
} 

public RepeatedTrip(String name, String description,boolean publicTrip, Date startMoment, 
     String intervalType, int interval, int frequency) { 
    super(name, description, publicTrip); 
    this.startMoment = startMoment; 
    this.intervalType = intervalType; 
    this.tripInterval = interval; 
    this.tripFrequency = frequency; 
} 
} 

一對多相關類X

package be.kdg.teamB.model.entities; 

import java.util.Date; 

import javax.persistence.*; 

import org.hibernate.annotations.Cascade; 

@Entity 
@Table(name = "t_tripexecutionmoment") 
public class TripExecutionMoment { 
@Id 
@GeneratedValue 
private int id; 
private Date executionPointOfTime; 
@ManyToOne 
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) 
@JoinColumn(name = "repeatedTripId") 
private RepeatedTrip repeatedTrip; 

public TripExecutionMoment() { 
} 

public TripExecutionMoment(Date executionPointOfTime) { 

    this.executionPointOfTime = executionPointOfTime; 
} 

    return executionPointOfTime; 
} 

public void setExecutionPointOfTime(Date executionPointOfTime) { 
    this.executionPointOfTime = executionPointOfTime; 
} 

public RepeatedTrip getRepeatedTrip() { 
    return repeatedTrip; 
} 

public void setRepeatedTrip(RepeatedTrip repeatedTrip) { 
    this.repeatedTrip = repeatedTrip; 
} 



} 

代碼被稱爲在這個方法:

public RepeatedTrip createRepeatedTrip(String name, String description,boolean publicTrip, 
     Date startMoment, String intervalType, int interval, 
     int frequency) { 

    session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    tx = session.beginTransaction(); 

    RepeatedTrip trip = new RepeatedTrip(name, description,publicTrip, startMoment, 
      intervalType, interval, frequency); 
    int intervalDefiner; 
    Date date = trip.getStartMoment(); 
    switch(intervalType){ 
    case "D": 
     intervalDefiner = Calendar.DATE; 
     break; 
    case "M": 
     intervalDefiner = Calendar.MONTH; 
     break; 
    case "W": 
     intervalDefiner = Calendar.WEEK_OF_YEAR; 
     break; 
    case "Y": 
     intervalDefiner = Calendar.YEAR; 
     break; 
    default: 
     intervalDefiner = Calendar.DATE; 
     break; 
    } 
    for(int i=0; i<frequency;i++){ 

     TripExecutionMoment tripExecutionMoment = new TripExecutionMoment(date); 
     trip.getTripExecutionMoments().add(tripExecutionMoment); 
     date = nextDate(intervalDefiner, interval, date); 
    } 


    session.saveOrUpdate(trip); 
    tx.commit(); 
    return trip; 

} 
+0

向我們展示你的代碼。你可能忘了初始化'X.b'字段。 – 2013-02-08 17:30:27

+0

感謝您的回覆。我添加了我的代碼(沒有setter和getters,我擁有所有字段)。我應該如何初始化X.b?我不完全明白你的意思。 – Charlie 2013-02-08 18:03:41

+0

但是你不顯示最有趣的部分。向我們展示您用於創建TripExecutionMoment並將其添加到RepeatedTrip的代碼。 – 2013-02-08 18:07:02

回答

0

這就是我的想法。要添加的TripExecutionMoment到RepeatedTrip:

trip.getTripExecutionMoments().add(tripExecutionMoment); 

但你不初始化雙向關聯,這是唯一一個休眠的業主方關心:

tripExecutionMoment.setRepeatedTrip(trip); 
+0

當然。我完全忽略了這一點。非常感謝你! – Charlie 2013-02-08 18:58:35