用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)
...从这个错推测是在把查询结果集封装成实体类时产生的是我配置错了能,还是根本就不能这样。

解决方案 »

  1.   

    我觉得不能
    比如说
    你在程序中向数据库中写入的话
    按照映射规则可以将不同的属性写入同一个字段?或者从数据库写入到java类中
    他怎么知道要按照哪一个去映射当然你是知道的
    可是计算机
    不会按照你的方式去执行的
    因为程序有两个出口。再说了两个属性为什么要映射同一个字段呢
    既然是同样的
    何必要多余一个
      

  2.   


    有道理。起始我这么做是原因是:
    1、有一个用户类User,一个订单类Orders
       User类有一个orders的集合
       订单会有很多未付款的订单,少量的付款了的订单我想要实现的是把orders集合分成两个:nopayOrders 和 paiedOrders 订单有已支付和为支付的标志字段。
    而且这两个集合里的对象都只是需要查看,不需要修改的。所有就做了上面那那种尝试,结果发现不行。谁还有其他可行的方法吗?
      

  3.   

    例如:
    一个账户表对应一个用户基本信息表
    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的字段
      

  4.   

    楼上的例子 我认为不恰当。@ManyToOne 如果使用上 @JoinColumn的话,在数据库中映射成的是三个表。其中中间表中的字段分别以两张表的名字+"_"+"ID"命名。JoinColumn修改的只是中间表中的一个字段,并不是原来的表。这就是两张表中有同名字段了。不知道我说清楚了吗。
      

  5.   


    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;
    }要实现这个映射,怎么进行配置呢???
      

  6.   

    呵呵,这位同学不对,@JoinTable才会映射成三个表(中间表),@JoinColumn不可能的
      

  7.   

    unpayOrders和paiedOrders两个属性是不可映射到表中的,只能与User表生成关系。但这种关系却是重复的,因此没有意义。我建议将此两个属性设为非持久的,再在逻辑层通过条件查询为此两个属性赋值。示例如下:User.java@Entity
    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属性赋值,而支付状态的区别,在展现层就可以解决。
      

  8.   


    对我弄错了 是@JoinTable 一对多默认是影射成三个表,如果使用@JoinColumn的话,就成了使用外健了。多谢。
      

  9.   


    unpayOrders和paiedOrders,这两个字段是没持久化到数据库。两个表中的关系只是:t_orders中有个user_id的字段。因为unpayOrders和paiedOrders使用的比较平凡
    所以,我希望通过映射的配置,在查询的时候就直接把这两个集合初始化了,避免去对较大的结果集进行遍历分类能实现吗
      

  10.   

    貌似iBatis框架可以实现,但它似乎没有完全兼容JPA规范。建议在逻辑层实现吧。