JPA - Persist Class不是实体

时间:2014-09-30 20:48:55

标签: java jpa

我有一个JPA项目(Eclipse Link),工作正常,但我想坚持一个不是Entity的类(或者在同一个Persistence Context中不是实体),目前我坚持引用id,之后我做了调用以检索Object。我需要知道最好的方法是什么...我不希望在bean中添加代码作为监听器事件,因为我想要一个干净的bean(构造函数,属性,设置器和没有注释的getter),

我的想法是扩展PersistenceContext(但是,我不知道该怎么做)添加一个过滤器并确定要持久化的类并做一些事情来替换未映射的类的持久性。

任何想法或我的问题都不合适?

这是一个简单的例子..

@Entity
public class Customer{

@Column
Integer id;

@Column
/*transient?*/
CustomerInfo customerInfo

/*setters and getters*/
}

/*this class maybe not be Entity.. Maybe be a Web Service Response Bean*/
public class CustomerInfo{
   private String firstName;
   private String lastName;
   private BigDecimal balance;
   /*setters and getters*/
}

3 个答案:

答案 0 :(得分:1)

根据评论中的NoDataFound提议,如果您不想添加ID,Embeddable / Embedded串联可能是解决方案:由于Id问题,您应该在同一个表中有数据(可以保留不同的类)。您拥有Java EE tutorial中的文档。如果您不想更改代码,可以使用XML进行对象/关系映射。在wikibook about JPA中,您有一个XML示例。

答案 1 :(得分:1)

根据我的意见:创建一个包含基本信息的嵌入式CustomerInfoKey

然后有两个解决方案:

  1. 继承:

    • CustomerInfo继承CustomerInfoKey
    • setCustomerInfoKey(customerInfo)customerInfoCustomerInfo一起使用。
  2. 组成和授权:

    • CustomerInfoKey key
    • 中设置字段CustomerInfo
    • CustomerInfoKey中委派CustomerInfo的getter / setter:

      public Foobar getFoobar() {return key.getFoobar()}
      public void setFoobar(Foobar foobar) {key.setFoobar(key);}
      
    • 使用方法getKey()并使用它来保存数据;您甚至可以创建一个在CustomerInfo中使用Customer并执行相应操作的setter。

  3. 我不知道JPA实现在遇到像解决方案#1这样的部分映射时的行为。但它应该有用。

答案 2 :(得分:0)

要解决此问题,我正在创建EntityListener

public interface JREntityListener<T> {
    public Class getTarget();
    public void postUpdate(T t) throws Exception;
    public void postCreate(T t) throws Exception;
    public void preMerge(T t) throws Exception;
    public void postMerge(T t) throws Exception;
    public void prePersist(T t) throws Exception;
    public void postPersist(T t) throws Exception;
}

我创建了一个类以捕获实体的事件

public class JRDescriptorEventListener<T> implements DescriptorEventListener{
  //implements all methods of DescriptorEventListener
  //i am Show only One to Example
  @Override
  public void postClone(DescriptorEvent descriptorEvent) {
    //        descriptorEvent.getObject();
    try {
      logger.info("postClone");
      t.postUpdate((T) descriptorEvent.getObject());
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }   
}

我使用EntityListener创建了一个绑定PersistenceContextjhadley致谢injecting a spring dependency into a JPA EntityListener):

public void addListener(JREntityListener t) {
    JpaEntityManager entityManager = null;
    try {
        // Create an entity manager for use in this function
        entityManager = (JpaEntityManager) entityManagerFactory.createEntityManager();
        // Use the entity manager to get a ClassDescriptor for the Entity class
        ClassDescriptor desc =
                entityManager.getSession().getClassDescriptor(t.getTarget());
        JRDescriptorEventListener jrDescriptorEventListener = new JRDescriptorEventListener(t);
        desc.getEventManager().addListener(jrDescriptorEventListener);
        logger.info("Entity Listener for " + t.getTarget().getCanonicalName() + " is added");
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    } finally {
        if (entityManager != null) {
            // Cleanup the entity manager
            entityManager.close();
        }
    }
}

现在我实现了Listener addind Listener

javoraiPersistenceBase.addListener(myEntityListener);

public class MyEntityListener implements JavoraiEntityListener<Customer> {

     @Autowired
     CustomerSvc customerSvc;


     @Override
     public Class getTarget() {
         return Customer.class;
     }

     @Override
    public void postUpdate(Customer customer) throws Exception {
      CustomerInfo customerInfo = globalDataSvc.findCustomerInfoById(customer.getCustomerInfo().getId());
      customer.setCustomerInfo(customerInfo);
    }
}