2015-06-20 41 views
0

我在JPA是新的,我都不再按照我的項目單位:JPA persit創造了許多新的現有實體到一個關係

動物實體:

package com.shop.model; 

import java.io.Serializable; 

import javax.persistence.*; 

@Entity 
@NamedQueries({ 
    @NamedQuery(name="Animal.findAll", query="SELECT a FROM Animal a"), 
    @NamedQuery(name="Animal.findAllByTypeId", query="SELECT a FROM Animal a WHERE a.type.id = :id"), 
}) 
public class Animal implements Serializable { 
    private static final long serialVersionUID = 1L; 
    public static String SMALL = "small"; 
    public static String MEDIUM = "medium"; 
    public static String LARGE = "large"; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    @Lob 
    private String description; 

    private String name; 

    private String size; 

    @ManyToOne(cascade=CascadeType.PERSIST) 
    private Type type; 

    public Animal() { 
    } 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getDescription() { 
     return this.description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getSize() { 
     return this.size; 
    } 

    public void setSize(String size) { 
     this.size = size; 
    } 

    public Type getType() { 
     return this.type; 
    } 

    public void setType(Type type) { 
     this.type = type; 
    } 

} 

類型的實體:

package com.shop.model; 

import java.io.Serializable; 
import javax.persistence.*; 
import java.sql.Timestamp; 
import java.util.List; 

@Entity 
@NamedQueries({ 
    @NamedQuery(name="Type.findAll", query="SELECT t FROM Type t"), 
}) 
public class Type implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    private Timestamp created; 

    private String name; 

    @OneToMany(mappedBy="type", cascade=CascadeType.PERSIST) 
    private List<Animal> animals; 

    public Type() { 
    } 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public Timestamp getCreated() { 
     return this.created; 
    } 

    public void setCreated(Timestamp created) { 
     this.created = created; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Animal> getAnimals() { 
     return this.animals; 
    } 

    public void setAnimals(List<Animal> animals) { 
     this.animals = animals; 
    } 

    public Animal addAnimal(Animal animal) { 
     getAnimals().add(animal); 
     animal.setType(this); 

     return animal; 
    } 

    public Animal removeAnimal(Animal animal) { 
     getAnimals().remove(animal); 
     animal.setType(null); 

     return animal; 
    } 
} 

我創建新的類型爲:

Type type = new Type(); 
type.setName("Some new animal type"); 
this.entityManager.getTransaction().begin(); 
this.entityManager.persit(type); 
this.entityManager.getTransaction().commit(); 
int lastInsertId = type.getId(); // wotks great! 

但是,當我嘗試使用現有類型產生新動物並且JPA創建一個新類型時,會創建 。這裏是例子

Animal animal = new Animal(); 
Type type = this.entityManager.getReference(Type.class, 9); 

animal.setName(name); 
animal.setDescription(description); 
animal.setSize(size); 
animal.setType(type); 

this.entityManager.getTransaction().begin(); 
this.entityManager.persit(animal); 
this.entityManager.getTransaction().commit(); 
int lastId = animal.getId(); // works great ! 

它工作正常(一個新的動物被創造),但它也帶來了新的類型,這是問題。我也試過用find(Object object,int id)方法,但它仍然創建一個新的Type。

我試過合併方法而不是persit,它工作正常!但getId返回的值爲。

我需要使用和現有的類型創建一個新的動物,也得到最後一個ID。那可能嗎?

回答

1

使用合併,你應該使用:

Entity entity=entityManager.merge(newEntity); 
    int lastId=entity.getId(); 

拿到參照對象,並獲得其id其中還堅持並不需要,因爲實體已經被託管後持續存在。

+0

謝謝阿修羅! – afym

相關問題