Java 行为类似于@Entity和@Embeddeble的类
我有一个单向@OneToMany关系在一个团队和球员阶级之间。我想在你们的队员中保存一个团队对象。球员的标识符由球队外键和列表索引组合而成,如下所示。我有一个像这样的地图,因为我需要拯救球队,你们的球员同时吃东西Java 行为类似于@Entity和@Embeddeble的类,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个单向@OneToMany关系在一个团队和球员阶级之间。我想在你们的队员中保存一个团队对象。球员的标识符由球队外键和列表索引组合而成,如下所示。我有一个像这样的地图,因为我需要拯救球队,你们的球员同时吃东西 @Entity public class Team { @Id @GeneratedValue private Integer id; @CollectionOfElements @JoinTable( name="PLAYE
@Entity
public class Team {
@Id
@GeneratedValue
private Integer id;
@CollectionOfElements
@JoinTable(
name="PLAYER",
joinColumns=@JoinColumn(name="TEAM_ID"))
@IndexColumn(name="PLAYER_INDEX")
private List<Player> playerList = new ArrayList<Player>();
}
@Embeddable
public class Player {
// Player's getter's and setter's
}
无论您使用@CollectionsOfements,播放器类都需要@Embedded注释,而不是@Entity。JPA不允许同时使用@Entity和@Embeddeble。玩家也是一个@实体-它与其他实体有关系
有人认为我可以通过使用CascadeType.PERSIST在玩家类中使用@Entity而不是@Embeddeble来拯救一个团队和一个玩家(单向关系)吗
记住,在保存前需要分配复合主键,但团队标识符和玩家列表索引位置可以扮演玩家复合主键的角色
您好,我觉得您犯了一些错误 @Embedded是一种表示由表中选定字段生成的对象/组件的方法。您可以使用它来表示复合键,但还需要使用@EmbeddedId 看看你想要实现什么,我觉得你可以通过一个简单得多的映射来实现。(为了简洁起见,省略了几个部分)
@实体
公开课小组{
@OneToMany(mappedBy=“团队”)
private List playerList=new ArrayList();
}
@优雅
公开课选手{
@许多酮
@JoinColumn(name=“团队ID”)
私人团队;
}
如果Player是一个join/link表,您可以使用@Embedded static类来表示复合键,请参阅《Java Persistence with JPA》一书以了解更多信息。下面的解决方案为Player显示了一个复合键,该复合键由团队和该团队中的参与者列表中的位置组成。将级联从团队保存到玩家 Team.java
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Version;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.hibernate.annotations.IndexColumn;
@Entity
public class Team implements Serializable {
@Id @GeneratedValue private Long id;
@Version private int version;
@OneToMany(cascade=CascadeType.ALL, mappedBy="id.team")
@IndexColumn(name="PLAYER_IDX")
private List<Player> players = new ArrayList<Player>();
private String name;
protected Team() {}
public Team(String name) {
this.name = name;
}
public boolean addPlayer(Player player) {
boolean result = players.add(player);
if (result) {
player.setPlayerId(new PlayerId(this, players.size() - 1));
}
return result;
}
public List<Player> getPlayers() {
return players;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("name", name).append("players", players).toString();
}
}
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
@Entity
public class Player implements Serializable {
@Id private PlayerId id;
@Version private int version;
void setPlayerId(PlayerId id) {
this.id = id;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("number", id.getNumber()).toString();
}
}
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.ManyToOne;
import org.apache.commons.lang.builder.HashCodeBuilder;
@Embeddable
public class PlayerId implements Serializable {
@ManyToOne
private Team team;
@Column(name="PLAYER_IDX", insertable=false, updatable=false)
private int number;
protected PlayerId() {}
PlayerId(Team team, int number) {
this.team = team;
this.number = number;
}
public int getNumber() {
return number;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
} else if (obj == this) {
return true;
} if (obj instanceof PlayerId) {
PlayerId other = (PlayerId) obj;
return other.team.equals(this.team) && other.number == this.number;
}
return false;
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(team).append(number).toHashCode();
}
}
PlayerId.java
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Version;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.hibernate.annotations.IndexColumn;
@Entity
public class Team implements Serializable {
@Id @GeneratedValue private Long id;
@Version private int version;
@OneToMany(cascade=CascadeType.ALL, mappedBy="id.team")
@IndexColumn(name="PLAYER_IDX")
private List<Player> players = new ArrayList<Player>();
private String name;
protected Team() {}
public Team(String name) {
this.name = name;
}
public boolean addPlayer(Player player) {
boolean result = players.add(player);
if (result) {
player.setPlayerId(new PlayerId(this, players.size() - 1));
}
return result;
}
public List<Player> getPlayers() {
return players;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("name", name).append("players", players).toString();
}
}
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
@Entity
public class Player implements Serializable {
@Id private PlayerId id;
@Version private int version;
void setPlayerId(PlayerId id) {
this.id = id;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("number", id.getNumber()).toString();
}
}
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.ManyToOne;
import org.apache.commons.lang.builder.HashCodeBuilder;
@Embeddable
public class PlayerId implements Serializable {
@ManyToOne
private Team team;
@Column(name="PLAYER_IDX", insertable=false, updatable=false)
private int number;
protected PlayerId() {}
PlayerId(Team team, int number) {
this.team = team;
this.number = number;
}
public int getNumber() {
return number;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
} else if (obj == this) {
return true;
} if (obj instanceof PlayerId) {
PlayerId other = (PlayerId) obj;
return other.team.equals(this.team) && other.number == this.number;
}
return false;
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(team).append(number).toHashCode();
}
}
这项测试如下:
public void testPersistTeamAndPlayers() throws Exception {
Team team = new Team("My Team");
team.addPlayer(new Player());
team.addPlayer(new Player());
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.addAnnotatedClass(Team.class);
configuration.addAnnotatedClass(Player.class);
configuration.configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session;
session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(team);
transaction.commit();
session.close();
session = sessionFactory.openSession();
@SuppressWarnings("unchecked") List<Team> list = session.createCriteria(Team.class).list();
assertEquals(1, list.size());
Team persisted = list.get(0);
System.out.println(persisted);
最后一行显示了
Team
和Player
的toString
,显示了如何分配号码(列表的索引)。其他实体可以引用该球员(按球队id和球员id)。祝贺你,马腾。回答得好。