用JPA,不能实体类的两只属性同时映射表的同一字段吗?我把实体的两个属性映射到同一字段后,一直抱错:java.lang.ArrayIndexOutOfBoundsException: 38
org.apache.openjpa.meta.ClassMetaData.getExtraFieldDataIndex(ClassMetaData.java:859)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:358)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:278)
org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:111)
org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:57)
org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:894)
org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:852)
org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:774)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:982)
org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:278)
org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2400)
org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.loadEagerJoin(RelationFieldStrategy.java:541)
org.apache.openjpa.jdbc.meta.FieldMapping.loadEagerJoin(FieldMapping.java:807)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1048)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1008)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:378)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:278)
org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:111)
org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:57)
org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:894)
...从这个错推测是在把查询结果集封装成实体类时产生的是我配置错了能,还是根本就不能这样。
org.apache.openjpa.meta.ClassMetaData.getExtraFieldDataIndex(ClassMetaData.java:859)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:358)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:278)
org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:111)
org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:57)
org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:894)
org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:852)
org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:774)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:982)
org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:278)
org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2400)
org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.loadEagerJoin(RelationFieldStrategy.java:541)
org.apache.openjpa.jdbc.meta.FieldMapping.loadEagerJoin(FieldMapping.java:807)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1048)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:1008)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:378)
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:278)
org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:111)
org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:57)
org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:894)
...从这个错推测是在把查询结果集封装成实体类时产生的是我配置错了能,还是根本就不能这样。
比如说
你在程序中向数据库中写入的话
按照映射规则可以将不同的属性写入同一个字段?或者从数据库写入到java类中
他怎么知道要按照哪一个去映射当然你是知道的
可是计算机
不会按照你的方式去执行的
因为程序有两个出口。再说了两个属性为什么要映射同一个字段呢
既然是同样的
何必要多余一个
有道理。起始我这么做是原因是:
1、有一个用户类User,一个订单类Orders
User类有一个orders的集合
订单会有很多未付款的订单,少量的付款了的订单我想要实现的是把orders集合分成两个:nopayOrders 和 paiedOrders 订单有已支付和为支付的标志字段。
而且这两个集合里的对象都只是需要查看,不需要修改的。所有就做了上面那那种尝试,结果发现不行。谁还有其他可行的方法吗?
一个账户表对应一个用户基本信息表
Account.class
BaseInfo.classpublic class BaseInfo implements Serializable{
@Id
@Column(name="id",length=36)
private String username;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Account account;
}可见username和account两个属性对应同一个名为id的字段
User.java
public class User{
...
private Set unpayOrders = new HashSet<Orders>();
private Set paiedOrders = new HashSet<Orders>();
...
}Orders.java
public class Orders{
private String hasPaied;// 0:已支付 1:未支付
private User user;
}要实现这个映射,怎么进行配置呢???
public class User{
...
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="user")
private Set<Orders> orders = new HashSet<Orders>(); @Transient
private Set unpayOrders = new HashSet<Orders>();
@Transient
private Set paiedOrders = new HashSet<Orders>();
...
}Orders.java@Entity
public class Orders{
private Boolean hasPaied;// 0:已支付 1:未支付 @ManyToOne(cascade=CascadeType.REFRESH,optional=false,fetch=FetchType.LAZY)
@JoinColumn(name="user")
private User user;
}//逻辑层:
User user = orm.getUser(xxx);
user.setUnpayOrders(orm.getOrders(user,1 or true));
user.setPaiedOrders(orm.getOrders(user,0 or false));但实际项目中,觉得没必要这么做,直接为orders属性赋值,而支付状态的区别,在展现层就可以解决。
对我弄错了 是@JoinTable 一对多默认是影射成三个表,如果使用@JoinColumn的话,就成了使用外健了。多谢。
unpayOrders和paiedOrders,这两个字段是没持久化到数据库。两个表中的关系只是:t_orders中有个user_id的字段。因为unpayOrders和paiedOrders使用的比较平凡
所以,我希望通过映射的配置,在查询的时候就直接把这两个集合初始化了,避免去对较大的结果集进行遍历分类能实现吗