persist()/merge() 在数据库中创建两行的原因是什么?

What can be a reason for persist()/merge() to create two rows in database?

我在 JavaEE 中开始我的第二个项目,并创建了简单的单例 bean 来初始化数据库中的一些数据以供将来调试之用。但是,我遇到了一个奇怪的问题——持久化方法(以及合并)在数据库中创建了两行。我所做的就是:

@Singleton   //ejb singleton
@Startup
public class DatabaseInitializer {

  @PersistenceContext
  private EntityManager entityManager;

  @PostConstruct
  public void initDatabase() {
    Calendar releaseDate = Calendar.getInstance();
    releaseDate.set(2010, 6, 16);
    Movie movie;
    List<Genre> genres = Arrays.asList(Genre.ACTION, Genre.ADVENTURE, Genre.MYSTERY, Genre.SCIFI, Genre.THRILLER);
    movie = new Movie("inception-2010", "Inception",
            "long string", releaseDate, "http://inceptionmovie.warnerbros.com/", genres);

    entityManager.persist(movie);
  }
}

这就是电影实体的样子:

@Entity
public class Movie {
  @Id
  @TableGenerator(name = "MovieSeq")
  @GeneratedValue(strategy = GenerationType.TABLE, generator = "MovieSeq")
  private int id;

  // @Column(unique = true) //couses exception due to creaton of two rows
  private String uniqueName;

  private String title;

  @Column(length = 1024)
  private String overview;

  @Temporal(TemporalType.DATE)
  private Calendar releaseDate;

  private String homepage;

  @ElementCollection   //tried removing this property, doesn't matter, 
  private List<Genre> genres;   //simple list of emuns

  //constructors, getters/setters
  ...
}

我尝试用谷歌搜索这个问题,但如果人们在 JPA 中搞砸了他们的关系,它似乎就会发生,但正如我们所看到的,这是有史以来最简单的情况。 当然,如果我创建 10 部电影,那么 JPA 会创建 20 行,依此类推。

我正在使用 Glassfish(Payara),它使用 EclipseLink 作为 JPA 提供程序,如果重要的话,Oracle 11g 是我的数据库。我不知道如何解决这个问题,因为我不知道我的设计可能存在的问题。

正如Dragan Bozanovic 所建议的那样,问题是由调用两次的@PostConstruct 方法引起的。我仍在努力解决这个问题,但这是另一个问题的主题