JPA /休眠。如何自动阻止继承字段获取类前缀

时间:2018-06-07 14:28:54

标签: java hibernate jpa

以下情况:当我尝试使用@EmbeddedId字段保存实体时,hibernate会使字段" mandant"从基类到" contact_mandant"抛出无效的标识符错误。表格中的列名称"联系人"是" mandant"而不是" contact_mandat"。 我只是不明白为什么会自动更改字段名称。 这里有一些代码:

    @MappedSuperclass
    public abstract class BaseId implements Serializable {

      @Column(name = "Mandant", precision = 2, nullable = false)
      protected Byte mandant;

      ...getter, setter...
    }

    @Embeddable
    public class ContactId extends BaseId implements Serializable {

       @Column(name = "Id_Contact", precision = 9)
       private Long id;

      ...getter, setter...
    }

    @Entity
    public class Contact extends Base {

      @EmbeddedId
      private ContactId contactId;

      ...getter, setter...
    }

   @Entity(name = "Employee")
   public class Employee extends Base {

    @EmbeddedId
    private EmployeeId id;

    @MapsId("contactId")
    @JoinColumns(value = {
            @JoinColumn(referencedColumnName = "Mandant"),
            @JoinColumn(referencedColumnName = "Id_Contact")
    })
    @OneToOne(fetch = FetchType.LAZY)
    private Contact contact;

       ...getter, setter...
    }

   @Embeddable
   public class EmployeeId extends BaseId implements Serializable {

     @Column(name = "Id_Employee", precision = 9)
     private Long id;

     private ContactId contactId;

      ...getter, setter...
    }

我来自.Net世界,我对JPA还不太熟悉。有人可以给我一个友好的提示,说明我做错了什么,或者我的实施问题出在哪里,拜托?

祝你好运 新闻记者

P.s。:Spring 4和Hibernate 5

1 个答案:

答案 0 :(得分:0)

使用共享组合密钥的解决方案:

没有" id"在@MapsId框架中生成以下查询:

"插入EMPLOYEE_DETAILS(AEN_DATUM,SACHB_KZ,DETAILS,employee_id_employee,employee_MANDANT)值(?,?,?,?,?)"

添加" id"到@MapsId查询是:

"插入EMPLOYEE_DETAILS(AEN_DATUM,SACHB_KZ,DETAILS,id_employee,MANDANT)值(?,?,?,?,?)"

@Entity(name = "Employee")
@Table(name = "EMPLOYEE")
public class Employee extends Base {

    @EmbeddedId
    private EmployeeId id;

    @Column(name = "FIRST_NAME", length = 100, nullable = false)
    private String firstName;

    @Column(name = "SUR_NAME", length = 100, nullable = false)
    private String surName;
...
}

@Embeddable
public class EmployeeId extends BaseId implements Serializable {

    @Column(name = "id_employee", precision = 9)
    private Long employeeId;
...
}

@Entity(name = "EmployeeDetails")
@Table(name = "EMPLOYEE_DETAILS")
public class EmployeeDetails extends Base {

    @EmbeddedId
    private EmployeeId id;

    @Column(name = "DETAILS", nullable = false)
    private String details;

    @MapsId("id")
    @OneToOne
    private Employee employee;
...
}

它与上面的实现不一样,但问题是一样的。该查询是使用CONTACT_MANDANT而非MANDANT生成的。

和平