Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EntityManager.merge插入重复的实体_Java_Hibernate_Persistence_Sqlite_Entitymanager - Fatal编程技术网

Java EntityManager.merge插入重复的实体

Java EntityManager.merge插入重复的实体,java,hibernate,persistence,sqlite,entitymanager,Java,Hibernate,Persistence,Sqlite,Entitymanager,我有一个非常特殊的设置:我用Java创建所有的类,在我的应用程序中连接它们(几个manytone关系) 然后,我想迭代我的对象并将它们保存到数据库中。有时,某个对象已经在数据库中,因此不应再次将其持久化 我实现了hashCode()和equals()-方法correct,但是我的em.merge()插入了对象 再次: 我创建了一些对象,也就是说,我创建了一些玩家并设置了他们所在的团队。这些团队在Java中可能是不同的对象,但根据他们的“equals”方法,它们是相同的。因此,如果我保存了一个玩家

我有一个非常特殊的设置:我用Java创建所有的类,在我的应用程序中连接它们(几个manytone关系)

然后,我想迭代我的对象并将它们保存到数据库中。有时,某个对象已经在数据库中,因此不应再次将其持久化

我实现了hashCode()和equals()-方法correct,但是我的em.merge()插入了对象

再次:

我创建了一些对象,也就是说,我创建了一些玩家并设置了他们所在的团队。这些团队在Java中可能是不同的对象,但根据他们的“equals”方法,它们是相同的。因此,如果我保存了一个玩家,那么应该相应地保存该团队(这是有效的),但是如果该团队存在于数据库中(根据equals方法),则不应该再次插入该团队,当然应该设置关系

我做错了什么?需要更多信息吗

    private static void saveModels(final Set<?> models) {
    EntityManagerFactory factory = null;

    factory = Persistence.createEntityManagerFactory("sqlite");

    EntityManager manager = factory.createEntityManager();

    manager.getTransaction().begin();

    for (Object object : models) {
        manager.merge(object);
    }

    manager.getTransaction().commit();

    manager.close();
    factory.close();
}

试着通过给球队一组球员作为一个场地来建立双向关系。这将是这样注释的

@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, targetEntity = Team.class)
Collection<Player> getPlayers() {
  return this.players;
}
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},targetEntity=Team.class)
集合getPlayers(){
归还这个。玩家;
}

JPA使用@Id字段进行合并,它不会使用equals和hashCode方法检查数据库中是否已经存在实体

在团队中添加@OneToMany映射,就像Bozho建议的那样,尽管我会这样做

@OneToMany(cascade = { CascadeType.ALL })
private List<Player> players = new ArrayList<Player>();

public void addPlayer(Player player) {
    player.setTeam(this);
    players.add(player);
}

public Collection<Player> getPlayers() {
    return new ArrayList<Player>(this.players);
}

Map teams=newhashmap();
...
如果(!teams.containsKey(teamName)){
团队t=新团队();
t、 setDescription(团队名称);
团队。放置(团队名称,t)
}
玩家p=新玩家();
p、 集合名(p);
teams.get(teamName).addPlayer(p);
...
saveModels(teams.values());

提供实体的代码。我是否也必须在我的应用程序中设置团队类中的玩家?因为这很难,因为我正在创建几个语义相同的团队类。。。希望你能理解,我的意思是…“几个团队课程”。。也许你应该在那里使用继承?无论如何,我们还没有看到完整的画面。“几个团队类”-它们都是同一个类,但不同的对象,用“new team()”创建;但是,由于它们都包含相同的描述,它们只应保存到数据库中一次。在我看来,这不是最干净的方法,但似乎很有效,谢谢!
@OneToMany(cascade = { CascadeType.ALL })
private List<Player> players = new ArrayList<Player>();

public void addPlayer(Player player) {
    player.setTeam(this);
    players.add(player);
}

public Collection<Player> getPlayers() {
    return new ArrayList<Player>(this.players);
}
Team t = new Team();
t.setName(teamName)
Player p = new Player();
p.setName(playerName);
p.setTeam(t);
Map<String, Team> teams = new HashMap<String,Team>();

...

if (!teams.containsKey(teamName)) {
    Team t = new Team();
    t.setDescription(teamName);
    teams.put(teamName, t)
}

Player p = new Player();
p.setName(p);
teams.get(teamName).addPlayer(p);

...

saveModels(teams.values());