我有一个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*/
}
答案 0 :(得分:1)
根据评论中的NoDataFound提议,如果您不想添加ID,Embeddable / Embedded串联可能是解决方案:由于Id问题,您应该在同一个表中有数据(可以保留不同的类)。您拥有Java EE tutorial中的文档。如果您不想更改代码,可以使用XML进行对象/关系映射。在wikibook about JPA中,您有一个XML示例。
答案 1 :(得分:1)
根据我的意见:创建一个包含基本信息的嵌入式CustomerInfoKey
。
然后有两个解决方案:
继承:
CustomerInfo
继承CustomerInfoKey
setCustomerInfoKey(customerInfo)
与customerInfo
和CustomerInfo
一起使用。组成和授权:
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。
我不知道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
创建了一个绑定PersistenceContext
(jhadley致谢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);
}
}