0

私は一対多の所有関係を持っています。ここに私の親クラスがあります:

@XmlRootElement
@Entity
public class Strip {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;

private long id;
private String filename = "";

@OneToMany(mappedBy = "strip", cascade = CascadeType.ALL)
private List<Quote> quotes = new ArrayList<Quote>();

public long getId() {
    return key.getId(); 
}

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

public String getFilename() {
    return filename;
}
public void setFilename(String filename) {
    this.filename = filename;
}

public List<Quote> getQuotes() {
    return quotes;
}

public void setQuotes(List<Quote> quotes) {
    this.quotes = quotes;
}

public Key getKey() {
    return key;
}
}

そして子クラス:

@XmlRootElement
@Entity
public class Quote {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;

private long id;

private String quote = "";

@ManyToOne
private Strip strip;

public long getId() {
    return key.getId();
}

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


public String getQuote() {
    return quote;
}

public void setQuote(String quote) {
    this.quote = quote;
}

@XmlTransient
public Strip getStrip() {
    return strip;
}

public void setStrip(Strip strip) {
    this.strip = strip;
}

}

また、Strip に Quote を追加する方法があります。

public JResponse<StripResult> putStripWithQuote(@PathParam("strip_id") long id,                                                     Quote quote) {
    StripResult result = new StripResult();
    EntityManager em = EMFService.get().createEntityManager();
    Strip strip = null;

    try {
        em.getTransaction().begin();

        strip = em.find(Strip.class, id);
        if (strip == null) {
            result.setCode("0");
            result.setMessage("Strip is not found.");
        } else {
            strip.getQuotes().add(quote);
        }

        em.getTransaction().commit();
    } catch (Exception e) {
        result.setCode("0");
        result.setMessage("Exception: " + e.getMessage());
    } finally {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
        em.close();
    }

    result.setStrip(strip);
    return JResponse.ok(result).build();
}

このメソッドを実行すると、既存の Strip エンティティと新しい Quote エンティティが更新されたことを Datastore Viewer で確認できます。

すべての引用を照会しても、すべて正常に動作し、すべての引用を表示できます。

Query q = em.createQuery("select from " + Quote.class.getName());
list = new ArrayList<Quote>(q.getResultList());

私の問題:entityManager.find(Quote.class, "id of existing quote")は何も返しません。

ここで何が間違っているか、欠けていますか? 永続化コンテキストに何か問題がありますか?

4

2 に答える 2

0

Quoteエンティティでは、定義されている主キーは@Id変数keyではなくid変数です。あなたがあなたの中で使っているのはこの値ですか?

em.find(Quote.class,"key of existing quote");

?

于 2012-08-23T16:32:52.080 に答える