Java 持久性单元无法建立多对多关系
好吧,这是一个奇怪的问题,因为我以前让它工作过。 所以我有两个类:游戏和开发者。他们有一种多对多的关系。 持久性单元自动生成桌面游戏开发者。 因此有3个表:游戏开发者和游戏开发者。 当我在数据库中输入信息时。桌面游戏和开发者将正常获得这些值,但桌面游戏开发者将保持为空。因此,这种关系没有得到承认。 此外,当我运行webapp时,表中的所有内容都应该删除。开发人员放弃罚款,但游戏仍然存在 任何朝正确方向的推动都是值得赞赏的 提前谢谢大家, 大卫 初始化:Java 持久性单元无法建立多对多关系,java,database,jpa,persistence,relation,Java,Database,Jpa,Persistence,Relation,好吧,这是一个奇怪的问题,因为我以前让它工作过。 所以我有两个类:游戏和开发者。他们有一种多对多的关系。 持久性单元自动生成桌面游戏开发者。 因此有3个表:游戏开发者和游戏开发者。 当我在数据库中输入信息时。桌面游戏和开发者将正常获得这些值,但桌面游戏开发者将保持为空。因此,这种关系没有得到承认。 此外,当我运行webapp时,表中的所有内容都应该删除。开发人员放弃罚款,但游戏仍然存在 任何朝正确方向的推动都是值得赞赏的 提前谢谢大家, 大卫 初始化: try { gameOrg
try {
gameOrganizer = (GameOrganizer) getServletContext().getAttribute("database");
Game game = new Game("Counter Strike: source");
Game game2 = new Game("Battlefield: bad company 3");
Game game3 = new Game("Killing floor");
Developer devel = new Developer("valve");
Developer devel2 = new Developer("EA Games");
Developer devel2b = new Developer("DICE");
Developer devel3 = new Developer("Ubisoft");
//The GameOrganizer is the controller between the model en the view.
//The view being the website.
//So gameOrganizer.addGame(game) will persist the object to the database.
gameOrganizer.addGame(game);
gameOrganizer.addGame(game2);
gameOrganizer.addGame(game3);
gameOrganizer.addDeveloper(devel);
gameOrganizer.addDeveloper(devel2);
gameOrganizer.addDeveloper(devel2b);
gameOrganizer.addDeveloper(devel3);
game.addDeveloper(devel);
devel.getGames().add(game);
game2.addDeveloper(devel2);
devel2.getGames().add(game2);
game2.addDeveloper(devel2b);
devel2b.getGames().add(game2);
game3.addDeveloper(devel3);
devel3.getGames().add(game3);
} catch (DatabaseException ex) {
Logger.getLogger(GameController.class.getName()).log(Level.SEVERE, null, ex);
} catch (DomainException ex) {
Logger.getLogger(GameController.class.getName()).log(Level.SEVERE, null, ex);
}
游戏类:
@Entity
public class Game implements Serializable{
private String gameNaam;
private double prijs;
@ManyToMany(mappedBy = "games")
private Collection<Developer> developers = new ArrayList<Developer>();
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
public Game(){};
.
.
//methods
.
.
}
@实体
公共类游戏实现了可序列化{
私有字符串gameNaam;
私人双prijs;
@许多(mappedBy=“游戏”)
private Collection developers=new ArrayList();
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
公共游戏{};
.
.
//方法
.
.
}
开发人员类
@Entity
public class Developer implements Serializable {
private String naam;
private String info;
@ManyToMany
private Collection<Game> games = new ArrayList<Game>();
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
public Developer() {
}
.
.
//methods
.
.
}
@实体
公共类开发人员实现可序列化{
私有字符串naam;
私有字符串信息;
@许多
私人收藏游戏=新ArrayList();
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
公共发展商(){
}
.
.
//方法
.
.
}
持久性股:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="GameDatabaseSitePU" transaction-type="RESOURCE_LOCAL">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<class>domainmodel.Developer</class>
<class>domainmodel.Game</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="toplink.jdbc.user" value="app"/>
<property name="toplink.jdbc.password" value="app"/>
<property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/GameDatabase;create=true"/>
<property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="toplink.ddl-generation" value="drop-and-create-tables"/>
</properties>
</persistence-unit>
</persistence>
oracle.toplink.essentials.PersistenceProvider
domainmodel.Developer
域名模型。游戏
错误的
我认为在双向多对多关系中,您需要设置双方
i、 如果你这样做了
devel.getGames().add(游戏)
你也需要这样做
game.getDeveloper().add(devel)
否则JPA将看不到另一面,对映射表的插入将类似于(FK1,null),这将失败,这就是为什么您不会看到任何条目
我对toplink了解不多,但我认为
<property name="toplink.logging.level" value="FINE"/>
应该在日志中为您提供sql语句,这有助于调试此类问题:)关系无法识别,因为您在建立关系之前保留了对象。在将对象添加到彼此集合后,执行调用gameOrganizer.add.()。还可以将持久化级联添加到多对多开发人员关系中:
@ManyToMany(cascade = CascadeType.PERSIST, mappedBy = "games")
private Collection<Developer> developers = new ArrayList<Developer>();
@ManyToMany(cascade=CascadeType.PERSIST,mappedBy=“games”)
private Collection developers=new ArrayList();
那么你只需要坚持游戏。嗨,我想我已经这么做了:game.addDeveloper(devel);devel.getGames().add(游戏);谢谢你的toplink提示。非常方便。