문제

레거시 데이터베이스가 있으며 EJB3을 사용하여 모델링하고 있습니다. 데이터베이스는 모양이 상당히 열악하며 DB에 삽입하는 방법에 대한 비정상적인 제한이 있습니다. 이제 DB Strucuture와 맞는 계층 구조로 데이터베이스를 모델링하고 싶지만 지속성 관리자가 엔터티 어린이를 지속하려고하지 않고 각 엔티티를 개별적으로 수동으로 삽입 할 수 있기를 원합니다.

나는 다음과 같은 것을 시도하고 있습니다 (Boilerplate Farm 아웃) :

@Entity
@Table(name = "PARENT_TABLE")
public class Parent {
    @Id
    @Column(name = "ID")
    int id;

    @OneToMany
    List<Child> children;
}


@Entity
@Table(name = "CHILD_TABLE")
public class Child {
    @Id
    @Column(name = "ID")
    int id;   
}

이제 이것은 예외를 던졌습니다.

java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST

지금 알다 엔티티는 지속적으로 표시되지 않습니다. 엔티티 메너가 그것을 유지하기를 원하지 않습니다! 부모님을 먼저 지속시킬 수 있고 아이를 함께 유지하고 싶지만 함께 할 수 없습니다. 이런 식으로하고 싶어하는 좋은 이유가 있지만, 플레이하고 싶지는 않습니다.

도움이 되었습니까?

해결책

Heh JPA 구성 인 헤어 풀링에 오신 것을 환영합니다.

귀하의 경우에는 두 가지 선택이 있습니다.

  1. 새 개체를 수동으로 유지합니다. 또는
  2. 자동으로 지속됩니다.

자동으로 유지하려면 관계에 주석을 달아야합니다. 이것은 일반적인 일대일 관용구입니다.

@Entity
@Table(name = "PARENT_TABLE")
public class Parent {
  @Id private Long id;

  @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
  private Collection<Child> children;

  public void addChild(Child child) {
    if (children == null) {
      children = new ArrayList<Child>();
    }
    child.setParent(parent);
    children.add(child);
  }
}

@Entity
@Table(name = "CHILD_TABLE")
public class Child {
  @Id private Long id;

  @ManyToOne
  private Parent parent;

  public void setParent(Parnet parent) {
    this.parent = parent;
  }
}

Parent parent = // build or load parent
Child child = // build child
parent.addChild(child);

캐스케이드 때문에 계속 작동합니다.

메모: 자바 수준에서 직접 관계를 관리해야하므로 수동으로 부모를 설정해야합니다. 이건 중요하다.

그것 없이는 객체를 수동으로 유지해야합니다. 이를 수행하려면 EntityManager가 필요합니다.이 경우 간단합니다.

entityManager.persist(child);

그 시점에서 그것은 올바르게 작동합니다 (다른 모든 일을 가정).

순전히 아동 엔티티의 경우 나는 주석 접근법을 선호합니다. 더 쉽습니다.

JPA로 언급 할 gotcha가 있습니다.

Parent parent = new Parent();
entityManager.persist(parent);
Child child = new Child();
parent.addChild(child);

이제 나는 이것에 대해 약간 녹슬었지만 아이가 추가되기 전에 부모가 지속 되었기 때문에 당신 이이 일을하면 문제가 발생할 수 있다고 생각합니다. 당신이 무엇을 하든지 조심 하고이 사건을 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top