私はJavaEEで2番目のプロジェクトを開始し、将来のデバッグの目的でデータベース内のいくつかのデータを初期化するために単純なシングルトンBeanを作成しました。しかし、私は奇妙な問題に固執しています - 永続メソッド(と同様にマージ)データベースに2つの行を作成します。そして、私はすべてがこれです:persist()/ merge()がデータベースに2つの行を作成する理由は何ですか?
@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);
}
}
そして、これは作品の実体がどのように見えるかです:私はこの問題をグーグルしようとしたが、人々が台無しJPAでのそれらの関係を場合に発生するようだが、
@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
...
}
これが最も単純なケースであることがわかります。 もちろん、10枚のムービーを作成すると、JPAは20行などを作成します。
私は、EclipseLinkをJPAプロバイダとして使用するGlassfish(Payara)を使用しています。まったく問題がなければ、Oracle 11gは自分のデータベースです。私はこの問題をどのように修正するのか分かりません。なぜなら、私のデザインに潜在的な問題があるかどうか分からないからです。
_initDatabase_メソッドが2回呼び出されていないことは確かですか? –
はい、私はそれを自分で呼び出すのではなく、私はまだそれを呼び出す方法がありません。 – newfolder
私はあなたがそれを呼んでいるとは言わなかったが、私はあなたにそれが2回呼び出されていないことを確認するように頼んだ(デバッガやログステートメントなどで確認できる)。 –