0

问题和问题非常简单,虽然很烦人,我正在寻找一个全局解决方案,因为它对我们来说是应用程序范围的问题。

下面的代码真的很不有趣,但我将其发布为澄清!

我们使用带有 JPA 2.0 的 PostgreSQL 数据库,我们生成了所有的外观和实体,当然我们做了一些编辑,但实际上并没有太多。

问题是每个实体都包含其子元素的集合,但是(仅对我们而言?)在创建子元素后不会更新。对象被写入数据库,您可以轻松选择它们,但我们真正希望看到的是父对象中刷新的子对象集合。

为什么会这样?如果我们(手动)刷新父实体,em.refresh(parent)它就可以解决问题,但我猜这对我们来说意味着在 Facades 中的大量工作。但也许没有别的办法?

感谢您的支持!

/* 编辑 */

我想它必须是一些注释问题或缓存或其他东西,但我已经尝试过

@OneToMany(mappedBy = "idquestion", orphanRemoval=true, fetch= FetchType.EAGER) 

@Cacheable(false)

没有正常工作。

/* 编辑 */

一些示例代码以供理解。

数据库级别:

CREATE TABLE Question (
        idQuestion SERIAL,
        questionContent VARCHAR,    
    CONSTRAINT Question_idQuestion_PK PRIMARY KEY (idQuestion)
);

CREATE TABLE Answer (
        idAnswer SERIAL,
        answerContent VARCHAR,
        idQuestion INTEGER,
    CONSTRAINT Answer_idAnswer_PK PRIMARY KEY (idAnswer),
    CONSTRAINT Answer_idQuestion_FK FOREIGN KEY (idQuestion) REFERENCES Question(idQuestion)
);

我们在 Netbeans 7.1 中生成了一些实体,它们看起来都类似于:

@Entity
@Table(name = "question", catalog = "jobfairdb", schema = "public")
@XmlRootElement
@NamedQueries({ BLAH BLAH BLAH...})
public class Question implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "idquestion", nullable = false)
    private Integer idquestion;
    @Size(max = 2147483647)
    @Column(name = "questioncontent", length = 2147483647)
    private String questioncontent;
    @OneToMany(mappedBy = "idquestion", orphanRemoval=true) 
    private Collection<Answer> answerCollection;

Getters... setters...

我们(再次)为它们使用生成的外观,所有实现AbstractFacade如下:

public abstract class CCAbstractFacade<T> {
    private Class<T> entityClass;

    public CCAbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }
4

2 回答 2

1

如果您使用容器管理的事务 在事务完成后获取集合,父实体会自动更新。否则,您必须更新自己的集合。

本文详细解释了这种行为:JPA 实现模式:双向关联

编辑:

使用 Container Managed Transactions 最简单的方法是拥有transaction-type="JTA"persistence.xml使用Container-Managed Entity Managers

于 2012-09-05T14:48:54.107 回答
0

您似乎设置了 ManyToOne 方面,但没有添加到 OneToMany,您必须两者都做。

在 JPA 和一般 Java 中,您必须更新双向关系的双方,否则对象的状态将不同步。不这样做,在任何 Java 代码中都是错误的,而不仅仅是 JPA。

JPA 中没有任何魔法可以为您做到这一点。EclipseLink 确实为此提供了一个神奇的选项,您可以通过定制器 (mapping.setRelationshipPartnerAttributeName()) 进行设置,但不建议这样做,将代码修复为正确是最好的解决方案。

见, http ://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

于 2012-09-06T12:41:19.357 回答