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 方法引起的。我仍在努力解决这个问题,但这是另一个问题的主题
我在 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 方法引起的。我仍在努力解决这个问题,但这是另一个问题的主题