JPA - wie muss ich eine Untertabelle anbinden?

Status
Nicht offen für weitere Antworten.

Landei

Top Contributor
JPA-Frage:

Ich habe eine Haupttabelle "sample" mit einer DB-generierten id. Dann habe ich eine Untertabelle "pixel" mit einem Primärschlüssel aus id (der auf sample.id verweist) und einem weiteren int-Feld "x".

Sample ist natürlich ein Entity. Netbeans hat mir Pixel aber auch als Entity angelegt und einen PixelPK aus id + x generiert. Nun will ich aber Pixel als einfaches Embeddable haben (Pixels werden nur zusammen mit ihrem Sample erzeugt und gelöscht, also wäre ein Entity overkill - außerdem sind es sehr viele). Wie geht das?

Danke!
 

Landei

Top Contributor
Noch ein wenig Code von meinem aktuellen Stand:

Code:
@Entity
@Table(name = "sample")
public class Sample implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "id", updatable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id; //mit getter und setter
    private List<Pixel> pixels;

    public List<Pixel> getPixelCollection() {
        return pixelCollection;
    }

    public void setPixelCollection(List<Pixel> pixelCollection) {
        this.pixelCollection = pixelCollection;
    }
   ...
}

@Embeddable
@Table(name = "pixel")
public class Pixel implements Serializable {
    @Column(name = "id")
    private int id; //mit getter und setter
    @Column(name = "x")
    private int x; //mit getter und setter
    @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Sample sample;
    ...
}

Die Frage ist, wie ich das jetzt persisten muss.

Wenn ich z.B. ein neues Sample anlege, muss ich das erst mal schreiben, damit ich die DB-generierte id bekomme, die ich ja brauche, um die Pixel-Objekte anzulegen?
 

Landei

Top Contributor
OK, habe gerade gelesen, dass das JPA nicht unterstützt, aber Hibernate soll es erlauben. Na dann werde ich mal Hibernate statt TopLink probieren...
 
G

Guest

Gast
Code:
public class Sample ... {
   ...
   @OneToMany(mappedBy="sample", cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
   private List<Pixel> pixels = new LinkedList<Pixel>();
   ...

   public Sample addPixel( final Pixel pixel ) {
      assert pixel.getId() == null; // wegen dem updatable = false in Pixel.sample nur neue Einträge
      pixel.setSample(this);
      pixels.add(pixel);
      return this;
   }

   oder besser

   public Sample addPixel( final int pixel ) {
      pixels.add(new Pixel(this, pixel));
      return this;
   }
}

@Entity
@Table(name = "pixel")
public class Pixel ... {
    @Id
    @GeneratedValue(...)
    private int id;
    @Column
    private int x;
    @ManyToOne(optional = false)
    @JoinColumn(name = "sample_id", referencedColumnName = "id", updatable = false)
    private Sample sample;
    ...
}

Sample sample = new Sample()
               .addPixel(new Pixel(1))
               .addPixel(new Pixel(2));
bzw.

Sample sample = new Sample().addPixel(1).addPixel(2);
em.persist(sample);

In Hibernate kannst du aber Collection mit Embedables speichern... kein Standard-JPA.
 

Landei

Top Contributor
Danke für die Starthilfe!

Ich habe heute versucht, Hibernate auf Netbeans oder in Eclipse für JPA aufzusetzen, aber ganz so einfach, wie das die Tutorials immer tun, ist es nicht (insbesondere Eclipse war da alles andere als übersichtlich). Also werde ich wohl in den sauren Entities-Apfel beißen müssen (was haben die beim JPA-Kaffeekränzchen eigentlich geraucht, wenn sowas einfaches wie Collections von Embeddables nicht möglich ist?).
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben