JAXB unmarshall,同样的对象 - 多个实例

时间:2016-06-06 16:07:08

标签: java jaxb

我有以下数据结构

public class League {

protected int Id;
protected List<Player> players;
protected List<Game> games;
}

public class Player {
protected string email;
protected League league;
}

public class Game {

protected int Id;
protected Player playerOne;
protected Player playerTwo;
protected int playerOneScore;
protected int playerTwoScore;
protected Round round;
}

我的问题是同一个Player对象应出现在联盟的球员列表中,但可以出现在该联盟的许多游戏中,如玩家或玩家两个。

JAXB作为单独的对象解组,即使我在解组后运行foreach循环以将游戏中的任何玩家与同一个电子邮件地址中的任何玩家匹配,他们也不会成为同一个对象。 / p>

我怎样才能使游戏对象在列表中使用相同的玩家对象并且不创建自己的玩家?

2 个答案:

答案 0 :(得分:1)

说实话,我并不喜欢实体的设计,但这是另一个问题。 (例如,联盟是玩家的财产,在我看来不应该映射到另一方。)

如果您保留此结构,则应收集所有不同的实体,并按其依赖关系的顺序加载它们。在您的情况下,依赖关系图中有一个圆圈,因此您应该使用@xmltransient(http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlTransient.html)注释来排除某些双向映射。 在此解决方案中,您应该进行以下瞬态

protected List<Player> players;

并转换

protected List<Game> games;

使用@xmladapter:http://www.eclipse.org/eclipselink/documentation/2.6/moxy/advanced_concepts006.htm在这个概念的帮助下,您应该能够&#34;转换&#34;将您的实体转换为密钥(在您的情况下为id / email)并在加载时解决它。

我真的建议重新考虑清理实体上的映射。 ;)

编辑:通过清理I ment删除循环依赖项。在我看来,一个更清洁的实体版本看起来像这样:

public class League {
   protected int Id;
   //other property?
   //protected String name;
}

public class Player {
   protected string email;
   protected League league;
}

public class Game {
   protected int Id;
   protected Player playerOne;
   protected Player playerTwo;
   protected int playerOneScore;
   protected int playerTwoScore;
   protected Round round;
}

在这种情况下,您的依赖项为DAG。在这种情况下,你仍然必须使用上面提到的#Xmladapter。这是一个link,它描述了几乎相同的问题。有很多选择,每个选择从一个diffenren角度解决问题,随意使用它们中的任何一个。

答案 1 :(得分:0)

我通过将playerId添加到播放器类来解决这个问题,然后在解组后通过ID匹配播放器对象