Search code examples
javagenericsjpaeclipselink

How to have a List of a MappedSuperType class in JPA Eclipselink?


When generating tables, eclipse says it doest recognize the type of stores in class DogMall. And I cannot make Generic Clases Entity since Their type cannot be determined at generating tables. The exact error is "The target entity of relationship attribute events on the class BaseballGame cannot be determined". the error appear when generating the tables with eclipse and not in the problems view. Im using Eclipse Juno SR1.

I didnt want to post the code since is very large. For a brief description Im using Generics for this reason: If I have a League class and s subclass BaseballLeague. League have a List of Athletes but I wanted that if the instance is of BaseballLeague, athletes must be BaseballPlayers and avoid that client can add BaslketballPlayer to the BaseballLeague class as the League have an Athletes List. That was answered in this question. Here is the affected code:

package pqlrd.bll.sport;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import pqlrd.bll.pim.Person;
@Entity
/**
 * Athlete
 * @author jhonnytunes
 *
 */
public abstract class Athlete extends Person {


/**
 * 
 */
private static final long serialVersionUID = 3099827166939719897L;

@OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
private PhysicalCondition physicalCondition;

@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
private List<PaymentCard> cards;

private List<ScoutingReport> report;

public Athlete() {
    // TODO Auto-generated constructor stub
}

public PhysicalCondition getPhysicalCondition() {
    return physicalCondition;
}

public void setPhysicalCondition(PhysicalCondition physicalCondition) {
    this.physicalCondition = physicalCondition;
}

public List<PaymentCard> getCards() {
    return cards;
}

public void setCards(List<PaymentCard> cards) {
    this.cards = cards;
}

public List<ScoutingReport> getReport() {
    return report;
}

public void setReport(List<ScoutingReport> report) {
    this.report = report;
}

public Athlete(PhysicalCondition physicalCondition,
        List<PaymentCard> cards, List<ScoutingReport> report) {
    super();
    this.physicalCondition = physicalCondition;
    this.cards = cards;
    this.report = report;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = super.hashCode();
    result = prime * result + ((cards == null) ? 0 : cards.hashCode());
    result = prime
            * result
            + ((physicalCondition == null) ? 0 : physicalCondition
                    .hashCode());
    result = prime * result + ((report == null) ? 0 : report.hashCode());
    return result;
}


@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (!super.equals(obj))
        return false;
    if (getClass() != obj.getClass())
        return false;
    Athlete other = (Athlete) obj;
    if (cards == null) {
        if (other.cards != null)
            return false;
    } else if (!cards.equals(other.cards))
        return false;
    if (physicalCondition == null) {
        if (other.physicalCondition != null)
            return false;
    } else if (!physicalCondition.equals(other.physicalCondition))
        return false;
    if (report == null) {
        if (other.report != null)
            return false;
    } else if (!report.equals(other.report))
        return false;
    return true;
}


}

//////////////////////////////////////////////////////////////

 package pqlrd.bll.sport;

import javax.persistence.Column;
import javax.persistence.Entity;

@Entity
/**
 * @author jhonnytunes
 *
 */
public abstract class BaseballEvent extends SportEvent<BaseballPlayer> {

/**
 * 
 */
private static final long serialVersionUID = 8163277354208426840L;

@Column(nullable = false)
private boolean onTop;

public void setOnTop(boolean onTop) {
    this.onTop = onTop;
}

public boolean isOnTop() {
    return onTop;
}

}
////////////////////////////////////////////////////
   package pqlrd.bll.sport;

import java.io.Serializable;
import java.util.LinkedList;
import javax.persistence.Entity;

@Entity
/**
 *  @author jhonnytunes
 *
 */
public class BaseballGame
        extends
    Game<BaseballPark, BaseballPlayer, BaseballEvent, BaseballCategory,             BaseballTeam>
    implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 2260373487163641360L;

}

////////////////////////////////////
package pqlrd.bll.sport;

import java.util.LinkedList;
import javax.persistence.Entity;

@Entity
/**
 * @author jhonnytunes
*/
public class BaseballLeague extends
    League<BaseballPark, BaseballPlayer, BaseballCategory> {

/**
 * 
 */
private static final long serialVersionUID = -3600825760889806131L;


}

//////////////////////////////////////////////////

package pqlrd.bll.sport;


import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
@Entity
/**
 * Baseball Player
 * @author jhonnytunes
 *
 */
public class BaseballPlayer extends Athlete {


@Enumerated(EnumType.STRING)
private Handedness _throws;


@Enumerated(EnumType.STRING)
private Handedness bats;


public BaseballPlayer() {
    // TODO Auto-generated constructor stub
}


public Handedness get_throws() {
    return _throws;
}


public void set_throws(Handedness _throws) {
    this._throws = _throws;
}


public Handedness getBats() {
    return bats;
}


public void setBats(Handedness bats) {
    this.bats = bats;
}


public BaseballPlayer(Handedness _throws, Handedness bats) {
    super();
    this._throws = _throws;
    this.bats = bats;
}

}

//////////////////////////////////////

package pqlrd.bll.sport;

import javax.persistence.Entity;

@Entity
/**
 * 
 * @author jhonnytunes
 *
 */
public class BaseballTournament
    extends
    Tournament<BaseballPark, BaseballPlayer, BaseballCategory, BaseballTeam,    TournamentInvitationBaseball, BaseballEvent, BaseballGame, BaseballLeague> {

/**
 * 
 */
private static final long serialVersionUID = 5315560497107867141L;

}


/////////////////////////////////

package pqlrd.bll.sport;

import java.io.Serializable;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import pqlrd.bll.pim.Person;

@MappedSuperclass
/**
 * Game
 * @author jhonnytunes
 */
public abstract class Game<P extends Park, A extends Athlete, SE extends SportEvent<A>, SC  extends SportCategory, T extends Team<A, SC>>
    implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -1554044669639703370L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PQLRD_SEQ")
private long id;

@Column(nullable = false)
@Temporal(TemporalType.DATE)
private Calendar date;

@Column(nullable = false)
private boolean played;

@JoinColumn(nullable = false)
private P park;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private Map<Integer, SE> events;

@JoinColumn(nullable = false)
private T homeTeam;
@JoinColumn(nullable = false)
private T visitorTeam;

private Person scorer;

private List<A> homeAthletes;
private List<A> visitorAthletes;
public Calendar getDate() {
    return date;
}
public void setDate(Calendar date) {
    this.date = date;
}
public boolean isPlayed() {
    return played;
}
public void setPlayed(boolean played) {
    this.played = played;
}
public P getPark() {
    return park;
}
public void setPark(P park) {
    this.park = park;
}
public Map<Integer, SE> getEvents() {
    return events;
}
public void setEvents(Map<Integer, SE> events) {
    this.events = events;
}
public T getHomeTeam() {
    return homeTeam;
}
public void setHomeTeam(T homeTeam) {
    this.homeTeam = homeTeam;
}
public T getVisitorTeam() {
    return visitorTeam;
}
public void setVisitorTeam(T visitorTeam) {
    this.visitorTeam = visitorTeam;
}
public List<A> getHomeAthletes() {
    return homeAthletes;
}
public void setHomeAthletes(List<A> homeAthletes) {
    this.homeAthletes = homeAthletes;
}
public List<A> getVisitorAthletes() {
    return visitorAthletes;
}
public void setVisitorAthletes(List<A> visitorAthletes) {
    this.visitorAthletes = visitorAthletes;
}
public long getId() {
    return id;
}



public Person getScorer() {
    return scorer;
}
public void setScorer(Person scorer) {
    this.scorer = scorer;
}
public Game() {
    // TODO Auto-generated constructor stub
}
public Game(Calendar date, boolean played, P park, Map<Integer, SE> events,
        T homeTeam, T visitorTeam, List<A> homeAthletes,
        List<A> visitorAthletes) {
    super();
    this.date = date;
    this.played = played;
    this.park = park;
    this.events = events;
    this.homeTeam = homeTeam;
    this.visitorTeam = visitorTeam;
    this.homeAthletes = homeAthletes;
    this.visitorAthletes = visitorAthletes;
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((date == null) ? 0 : date.hashCode());
    result = prime * result + ((events == null) ? 0 : events.hashCode());
    result = prime * result
            + ((homeAthletes == null) ? 0 : homeAthletes.hashCode());
    result = prime * result
            + ((homeTeam == null) ? 0 : homeTeam.hashCode());
    result = prime * result + (int) (id ^ (id >>> 32));
    result = prime * result + ((park == null) ? 0 : park.hashCode());
    result = prime * result + (played ? 1231 : 1237);
    result = prime * result
            + ((visitorAthletes == null) ? 0 :  visitorAthletes.hashCode());
    result = prime * result
            + ((visitorTeam == null) ? 0 : visitorTeam.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Game other = (Game) obj;
    if (date == null) {
        if (other.date != null)
            return false;
    } else if (!date.equals(other.date))
        return false;
    if (events == null) {
        if (other.events != null)
            return false;
    } else if (!events.equals(other.events))
        return false;
    if (homeAthletes == null) {
        if (other.homeAthletes != null)
            return false;
    } else if (!homeAthletes.equals(other.homeAthletes))
        return false;
    if (homeTeam == null) {
        if (other.homeTeam != null)
            return false;
    } else if (!homeTeam.equals(other.homeTeam))
        return false;
    if (id != other.id)
        return false;
    if (park == null) {
        if (other.park != null)
            return false;
    } else if (!park.equals(other.park))
        return false;
    if (played != other.played)
        return false;
    if (visitorAthletes == null) {
        if (other.visitorAthletes != null)
            return false;
    } else if (!visitorAthletes.equals(other.visitorAthletes))
        return false;
    if (visitorTeam == null) {
        if (other.visitorTeam != null)
            return false;
    } else if (!visitorTeam.equals(other.visitorTeam))
        return false;
    return true;
}



}
////////////////////////////////
package pqlrd.bll.sport;

import java.io.Serializable;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.apache.commons.lang.WordUtils;

import pqlrd.bll.cms.Attachment;
import pqlrd.bll.money.Payment;
import pqlrd.bll.pim.Address;
import pqlrd.bll.pim.ContactInformation;


@MappedSuperclass
/**
 * League class
 * @author jhonnytunes
 *
 */
public abstract class League<P extends Park, A extends Athlete, SC extends  SportCategory> implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -6036071460102749097L;

@Id@GeneratedValue(strategy= GenerationType.SEQUENCE,generator="PQLRD_SEQ") 
private int id;

@Column(length=30, nullable=false)
private String name;

@Column(nullable=false)
@Temporal(TemporalType.DATE)
private Calendar dateOfOrigin;

@Column(columnDefinition="text")
private String history;

@ElementCollection
private List<String> requirements;

private List<AthletesCost> athletesCosts;

@Column(nullable=false)
private boolean visible;

private P park;

@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
private List<LeagueStaff> leagueStaffs;

@OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
private List<ContactInformation>contactInformations;

@OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
private Address address;

@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
private List<Team<A, SC>> teams;

@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
private List<Attachment> attachments;

public String getName() {
    return WordUtils.capitalizeFully(name);
}

public void setName(String name) {
    this.name = name.toLowerCase();
}

public Calendar getDateOfOrigin() {
    return dateOfOrigin;
}

public void setDateOfOrigin(Calendar dateOfOrigin) {
    this.dateOfOrigin = dateOfOrigin;
}

public String getHistory() {
    return history;
}

public void setHistory(String history) {
    this.history = history;
}

public List<String> getRequirements() {
    return requirements;
}

public void setRequirements(List<String> requirements) {
    this.requirements = requirements;
}

public List<AthletesCost> getAthletesCosts() {
    return athletesCosts;
}

public void setAthletesCosts(List<AthletesCost> athletesCosts) {
    this.athletesCosts = athletesCosts;
}

public boolean isVisible() {
    return visible;
}

public void setVisible(boolean visible) {
    this.visible = visible;
}

public P getPark() {
    return park;
}

public void setPark(P park) {
    this.park = park;
}

public List<LeagueStaff> getLeagueStaffs() {
    return leagueStaffs;
}

public void setLeagueStaffs(List<LeagueStaff> leagueStaffs) {
    this.leagueStaffs = leagueStaffs;
}

public List<ContactInformation> getContactInformations() {
    return contactInformations;
}

public void setContactInformations(List<ContactInformation> contactInformations) {
    this.contactInformations = contactInformations;
}

public Address getAddress() {
    return address;
}

public void setAddress(Address address) {
    this.address = address;
}

public List<Team<A, SC>> getTeams() {
    return teams;
}

public void setTeams(List<Team<A, SC>> teams) {
    this.teams = teams;
}

public List<Attachment> getAttachments() {
    return attachments;
}

public void setAttachments(List<Attachment> attachments) {
    this.attachments = attachments;
}

public int getId() {
    return id;
}


public League() {
    // TODO Auto-generated constructor stub
}

public League(String name, Calendar dateOfOrigin, String history,
        List<String> requirements, List<AthletesCost> athletesCosts,
        boolean visible, P park, List<LeagueStaff> leagueStaffs,
        List<ContactInformation> contactInformations, Address address,
        List<Team<A, SC>> teams, List<Attachment> attachments) {
    super();
    this.name = name;
    this.dateOfOrigin = dateOfOrigin;
    this.history = history;
    this.requirements = requirements;
    this.athletesCosts = athletesCosts;
    this.visible = visible;
    this.park = park;
    this.leagueStaffs = leagueStaffs;
    this.contactInformations = contactInformations;
    this.address = address;
    this.teams = teams;
    this.attachments = attachments;
}




}

/////////////////////////////

package pqlrd.bll.sport;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.MappedSuperclass;

import org.apache.commons.lang.math.NumberUtils;

import pqlrd.bll.util.NumbersUtil;
@IdClass(SportEventPK.class)
@MappedSuperclass
/**
 * Event that occur in a time of a game
 * @author jhonnytunes
 *
 */

public abstract class SportEvent<T extends Athlete> implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 3814280347145588159L;

@Id private T athlete;
@Id private short period;
@Id private long random;
@Id private short quantity;



public T getAthlete() {
    return athlete;
}
public void setAthlete(T athlete) {
    this.athlete = athlete;
}
public short getPeriod() {
    return period;
}
public void setPeriod(short period) {
    this.period = period;
}
public long getRandom() {
    return random;
}

public SportEvent() {

    this.random = NumbersUtil.random.nextLong();
}
public short getQuantity() {
    return quantity;
}
public void setQuantity(short quantity) {
    this.quantity = quantity;
}



}

//////////////////////////////

package pqlrd.bll.sport;

import java.io.Serializable;

import javax.persistence.Embeddable;

public class SportEventPK implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -1251889014150257402L;

private Athlete athlete;
private short period;
private long random;
private short quantity;



public short getQuantity() {
    return quantity;
}

public void setQuantity(short quantity) {
    this.quantity = quantity;
}

public SportEventPK() {
    // TODO Auto-generated constructor stub
}

protected Athlete getAthlete() {
    return athlete;
}

protected void setAthlete(Athlete athlete) {
    this.athlete = athlete;
}

protected short getPeriod() {
    return period;
}

protected void setPeriod(short period) {
    this.period = period;
}

protected long getRandom() {
    return random;
}

protected void setRandom(long random) {
    this.random = random;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((athlete == null) ? 0 : athlete.hashCode());
    result = prime * result + period;
    result = prime * result + (int) (random ^ (random >>> 32));
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    SportEventPK other = (SportEventPK) obj;
    if (athlete == null) {
        if (other.athlete != null)
            return false;
    } else if (!athlete.equals(other.athlete))
        return false;
    if (period != other.period)
        return false;
    if (random != other.random)
        return false;
    return true;
}

}
/////////////////////////

package pqlrd.bll.sport;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
@MappedSuperclass

/**
 * @author jhonnytunes
 *
 */
public abstract class Team<A extends Athlete, SC extends SportCategory > implements     Serializable {

/**
 * 
 */
private static final long serialVersionUID = 5556278910044704061L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PQLRD_SEQ")
private int id;

@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
private List<PracticeTime> times;

@JoinColumn(nullable=false)
private SC category;

private List<A> athletes;

public List<PracticeTime> getTimes() {
    return times;
}

public void setTimes(List<PracticeTime> times) {
    this.times = times;
}

public SC getCategory() {
    return category;
}

public void setCategory(SC category) {
    this.category = category;
}

public List<A> getAthletes() {
    return athletes;
}

public void setAthletes(List<A> athletes) {
    this.athletes = athletes;
}

public int getId() {
    return id;
}

public Team() {
    // TODO Auto-generated constructor stub
}

public Team(List<PracticeTime> times, SC category, List<A> athletes) {
    super();
    this.times = times;
    this.category = category;
    this.athletes = athletes;
}


}

Solution

  • Solved. Removed the @OneToMany anotations from the atatributes that are collection of a mappedsuperclass.