休眠多对一 JOIN 由非 PK 列抛出"Bad value for type int"



首先让我明确我的场景,我使用hibernate 4.3,Postgresql9.3和springMVC,我使用JBOSS工具进行逆向工程类。

每次我使用HQL或session.get()选择数据时,我都会得到(SQL查询运行良好)由以下原因引起:org.postgresql.util.PSQLException:类型int的值不正确:demoemailaddr@gmail.com

实体类,
应用程序.java

@Entity
@Table(name = "applicant", schema = "public", uniqueConstraints = { @UniqueConstraint(columnNames = "user_id"), @UniqueConstraint(columnNames = "email"), @UniqueConstraint(columnNames = "registration_id") })
public class Applicant implements java.io.Serializable
{
    @Id
    @Column(name = "application_id", unique = true, nullable = false, length = 7)
    private String applicationId;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "email", unique = true, nullable = false)
    private Users usersByEmail;
     // setters and getters
}

以及与上述类具有@ManytOne关系的Users类。

@Entity
@Table(name = "users", schema = "public", uniqueConstraints = { @UniqueConstraint(columnNames = "email"), @UniqueConstraint(columnNames = "application_id") })
public class Users implements java.io.Serializable
{
    @Id
    @Column(name = "user_id", unique = true, nullable = false)
    private int userId;
    @Column(name = "email", unique = true, nullable = false, length = 100)
    private String email;
}

现在检查模式结构

CREATE TABLE users
(
  email character varying(100) NOT NULL,
  user_id integer NOT NULL,
  CONSTRAINT users_pk PRIMARY KEY (user_id),
  CONSTRAINT unique_email UNIQUE (email)
)
 CREATE TABLE applicant
(
  application_id character(7) NOT NULL,
  email character varying(100) NOT NULL,
  CONSTRAINT users_email_fk FOREIGN KEY (email)
  REFERENCES users (email) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT unique_applicant_email UNIQUE (email)
 )

[编辑]我在用户表的电子邮件上使用联接列,该列有唯一约束,但不是PK(PK是user_id)
PS:我无法更改数据库架构,我没有权限

您需要将referencedColumnName属性添加到@ManyToOne关联:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "email", referencedColumnName = "email", unique = true, nullable = false)
private Users usersByEmail;

如果将joinColumn定义为电子邮件,则在创建联接时将使用申请人表中的email列(包含电子邮件值的varchar)。但联接是由@ID注释字段完成的,对于用户来说,该字段是userId,并且是数字字段,所以您会得到异常。

Join总是按@ID,字段,joincolumn只告诉它应该存储在联接或本地表中的位置。

您需要在数据库中定义一个主键(而不是多个唯一字段),或者使用reveng.xml告诉hibernate工具什么是真正的主键。

你需要这样的东西:

<table name="applicant"> 
 <primary-key>
  <key-column name="application_id"/>
 </primary-key>
</table>

您可以在以下文档中查看详细信息:http://docs.jboss.org/tools/latest/en/hibernatetools/html/reverseengineering.html

最新更新