【问题标题】:jpa OneToMany relation on dedicated parameter/column专用参数/列上的 jpa OneToMany 关系
【发布时间】:2014-12-09 14:26:04
【问题描述】:

我有带参数的表客户:

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;
    public Long id_crm;
    public String City;
    public String Country;

还有我存储一些联系信息的第二个表。

@Entity
public class CustomerContact {
  @Id
  public Long id;
  public Role role;
  public Department department;
  public Long customer_id_crm
}

第二个表是从外部 crm 应用程序获得的,所以我添加了列 id_crm 用于关系作为外键。

我想在列上的这两个实体之间建立关系: Customer.id_crmCustomerContact.customer_id_crm

该 sql 查询将如下所示:

Select * FROM Customer 
Join CustomerContact 
on Customer.id_crm=CustomerContact.customer_id_crm

我什至可以用 jpa 实现这一点吗?如果是这样的话?如何做到这一点?

【问题讨论】:

  • 您是使用复合键还是简单键,我发布代码来建立关系。我正在使用我的代码进行演示,而不是您的,请在 5 分钟内查看答案。
  • 你在找什么?映射?客户与客户联系人之间是什么关系,一对一,一对多?
  • 还没有任何关系。我正要这样做。但我必须使用不同的列作为联系人表中的外键。

标签: hibernate jpa one-to-many foreign-key-relationship


【解决方案1】:

试试这个

session.createQuery("select c, cc from Customer c, CustomerContact cc where c.id_crm = cc.customer_id_crm")

【讨论】:

    【解决方案2】:

    这是与画布具有一对多关系的人员类:

    @Entity
    @Table(name="person")
    public class Person implements UserDetails{
    
    
        @Id
        @Column(name="id")
        @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "person_seq_gen")
        @SequenceGenerator(name = "person_seq_gen",sequenceName = "person_seq")
        private int id;
    @OneToMany(mappedBy = "person1",fetch = FetchType.EAGER,cascade = CascadeType.REMOVE)
        private Set<Canvas> canvas1 = new HashSet<Canvas>();
    
        public Set<Canvas> getCanvas1() {
            return canvas1;
        }
    
        public void setCanvas1(Set<Canvas> canvas1) {
    
            this.canvas1 = canvas1;
        }
    }
    

    画布模型:

    @Entity
    @Table(name = "canvas")
    public class Canvas {
    
        @Id
        @Column(name="canvasid")
        @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "canvas_gen")
        @SequenceGenerator(name = "canvas_gen",sequenceName = "canvas_seq")
        private int canvasid;
    
     @ManyToOne
        @JoinColumn(name = "id",nullable = false)
        @JsonIgnore 
        private Person person1;
    
        public Person getPerson1() {
            return person1;
        }
    
        public void setPerson1(Person person1) {
            this.person1 = person1;
        }
    
        public int getPerson1id(){
            return this.person1.getId();
        }
    }
    

    当你想添加画布时,这里是 DAOImpl:

    public void addCanvas(Canvas canvas, Person person) {
            int id = person.getId();
            if( session == null) {
                session = this.sessionFactory.openSession();
            }else {
                session = this.sessionFactory.getCurrentSession();
            }
            Person person1 = (Person) session.get(Person.class,id);
            person.getCanvas1().add(canvas);
            canvas.setPerson1(person1);
            session.merge(canvas);
            session.flush();
    
        }
    

    而且我也有类似你查询的方法:

    public List<Canvas> listCanvasPerson(Person person) {
           int id = person.getId();
            if(session == null){
                session = this.sessionFactory.openSession();
            } else{
                session = this.sessionFactory.getCurrentSession();
            }
    
            Query query = session.createQuery("from Canvas as c where c.person1.id=:id order by c.canvasnumber");
            query.setParameter("id",id);
            List<Canvas> canvasList = query.list();
    

    希望这会有所帮助,如果我在某个地方犯了错误,请告诉我。请理解我使用的是简单键,而不是复合键。

    【讨论】:

    • 会话不是 JPA。问题是关于 JPA 的
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2010-10-27
    • 2014-07-30
    相关资源
    最近更新 更多