5

这是一个独立的 Java 应用程序,而不是 Web 应用程序。所以当我像这样坚持对象时

public <T> T create(T t) {
    em.getTransaction().begin();
    em.persist(t);
    em.flush();
    em.getTransaction().commit();
    return t;
}

即使在数据库中正确创建了具有正确数据和 id 的新行,对象内部仍然为空idT t通常在我的 web 应用程序中使用@EJBid在我持久化之后立即可用,因为它将实体对象持久化到我的持久化上下文中,我不确定我是否在这里有我的持久化上下文?

这就是我在 @Entity 类中映射我的 id 的方式

@Id
@Basic(optional = false)
@Column(name = "ID")
private Long id;

我也在数据库中创建了这个表的 id AUTO_INCREMENT,就像这样

CREATE TABLE Config
(
    ID int NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (ID)
)

这就是我获取 EntityManager 的方式

EntityManagerFactory emf = Persistence.createEntityManagerFactory("CorePU");
em = emf.createEntityManager();

这是我里面的东西persistence.xml

<persistence-unit name="CorePU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>    
<class>com.wf.docsys.core.model.Config</class>    
<properties>
  <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/XNINFODB"/>
  <property name="javax.persistence.jdbc.password" value="xxx"/>
  <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
  <property name="javax.persistence.jdbc.user" value="xxx"/>
</properties>

请帮忙,我不确定我在这里做错了什么。

4

4 回答 4

4

尝试@GeneratedValue在您的 id 字段上添加一个。

于 2012-04-05T21:21:21.800 回答
1

正如我在这篇文章中发现的,EntityManager 有一个名为refresh的方法,它会在你持久化他之后更新你的对象。

所以你的代码可能看起来像这样:

public <T> T create(T t) {
    em.getTransaction().begin();
    em.persist(t);
    em.refresh(t);
    em.flush();
    em.getTransaction().commit();
    return t;
}

我还没有对此进行测试,所以我不确定将刷新方法调用放在哪里,在提交之后,刷新之后等等。

希望它可以帮助你。

祝你好运。

于 2012-04-06T00:04:22.690 回答
1

我知道这不是持久化,但合并会更简单地做同样的事情。我将我的持久性包装在一个实际的合并操作中,如果实体不存在,它将保存它。

public T persist(T obj) {
    EntityManager em = ThreadLocalPersistenceManager.getEntityManager();

    EntityTransaction tx = em.getTransaction();
    try {
        tx.begin();
        obj = em.merge(obj);
    } finally {
        if (! tx.getRollbackOnly()) {
            tx.commit();
        }
    }

    return obj;
}


/**
 * This will save the object and return the id of the persisted object.
 *  
 * @param obj
 * @return The id of the persisted object.
 */
public Long save(T obj) {
    persist(obj);
    return obj.getId();
}
于 2013-02-22T22:53:00.720 回答
0

这是我的答案。经过测试

映射您的 ID 时,请从我上面的内容切换,即

@Id
@Basic(optional = false)
@Column(name = "ID")
private Long id;

@Entity
public class Person {
   @Id
   @TableGenerator(name="TABLE_GEN", table="SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
       valueColumnName="SEQ_COUNT", pkColumnValue="PERSON_SEQ")
   @GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN")
   private long id;
   ...
}

由于我使用 Microsoft SQL 服务器,因此我必须使用@TableGenerator. 更多信息可以在这里找到http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Table_sequencing

于 2012-04-05T23:49:43.477 回答