Помощь в сопоставлении составного внешнего ключа в JPA 2.0 - PullRequest
6 голосов
/ 19 апреля 2011

Я новичок в JPA и пытаюсь отобразить устаревшую базу данных. Файлы загружаются правильно по отдельности, но отношения не работают правильно. Любая помощь будет оценена.

Java

@Entity
@IdClass(ParentKey.class)
public class Parent {
    @Id
    @Column(name="code")
    private String code;

    @Id
    @Column(name="id")
    private int id;

    @OneToMany(mappedBy="parent")
    private List<Child> children = new ArrayList<Child>();
}

public class ParentKey {
    private String code;
    private int id;
}

@Entity
@IdClass(ChildKey.class)
public class Child {
    @Id
    @JoinColumns({
        @JoinColumn(name="code")
        @JoinColumn(name="id")
    })
    private Parent parent;

    @Id
    @Column(name="index")
    private int index;
}

public class ChildKey {
    private String code;
    private int id;
    private int index;
}

SQL

create table Parent(
  code char(4) not null,
  id int not null,
  primary key(code,id)
);

create table Child(
  code char(4) not null,
  id int not null,
  index int not null,
  primary key(code, id, index),
  foreign key(code, id) references Parent(code,id)
);

изменить 1: добавьте классы ChildKey и ParentKey.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

Вот то, что OpenJPA создал, используя свой инструмент ReverseMapping, и, похоже, он работает правильно.

@Entity
@Table(name="PARENT")
@IdClass(ParentId.class)
public class Parent {
  @OneToMany(targetEntity=Child.class, mappedBy="parent", cascade=CascadeType.MERGE)
  private Set childs = new HashSet();

  @Id
  @Column(length=4)
  private String code;

  @Id
  private int id;

  //omitted getters, setters
}

public class ParentId implements Serializable {
  public String code;
  public int id;

  //omitted getters, setters, toString, equals, hashcode
}

@Entity
@Table(name="CHILD")
@IdClass(ChildId.class)
public class Child {
  @Id
  @Column(length=4)
  private String code;

  @Id
  private int id;

  @Id
  private int index;

  @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
  @JoinColumns({@JoinColumn(name="code"), @JoinColumn(name="id")})
  private Parent parent;

  //omitted getters, setters
}

public class ChildId implements Serializable {
  public String code;
  public int id;
  public int index;

  //omitted getters, setters, toString, equals, hashcode
}
2 голосов
/ 19 апреля 2011

Вот ссылка на DataNucleus docs для составного отношения 1-N. Может помочь вам определить, что не так. Для начала у вас нет определенного IdClass для Child

http://www.datanucleus.org/products/accessplatform_3_0/jpa/orm/compound_identity.html#1_N_coll_bi

0 голосов
/ 12 января 2015

См. Также http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0 (добавить @Id в поле @ManyToOne)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...