2016-09-20 6 views
0

나는 JavaEE에서 나의 두 번째 프로젝트를 시작하고, 미래의 디버그 목적을 위해 데이터베이스의 일부 데이터를 초기화하기 위해 간단한 싱글 톤 빈을 만들었다. 그러나, 나는 이상한 문제에 갇혀있다 - 영원한 방법 (뿐만 아니라 병합) 데이터베이스에 두 개의 행을 만듭니다. 내가하는 모든 일이있다 :persist()/merge()가 데이터베이스에 두 개의 행을 생성하는 이유는 무엇입니까?

@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 행을 생성합니다.

EclipseLink를 JPA 제공 업체로 사용하는 Glassfish (Payara)를 사용하고 있으며, Oracle 11g는 전혀 문제가 없다면 Oracle 데이터베이스가 내 데이터베이스입니다. 내 디자인에 잠재적 인 문제가 있는지 알지 못하기 때문에이를 해결하는 방법을 모릅니다.

+1

_initDatabase_ 메서드가 두 번 호출되지 않았습니까? –

+0

네, 저 자신을 부르지 않고 있습니다. 아직 전화 할 길이 없습니다. – newfolder

+1

나는 당신이 그것을 부르고 있었다고 말하지 않았다, 나는 당신에게 그것이 두 번 호출되지 않는다는 것을 확인하도록 요청했다. (디버거, 로그 문 등을 통해 확인할 수있다.) –

답변

0

Dragan Bozanovic 제안 된 문제는 @PostConstruct 메서드가 두 번 호출하여 해결할 수 있습니다. 아직 해결 중이지만 다른 질문에 대한 주제입니다