对不起,我的英语不是我的母语,而且已经两点钟了,所以现在不能思考了。现在,在将hibernate与Java和PostgreSQL一起使用时,我遇到了下一个问题:我有如下实体Human和User(带有注释映射):
@Inheritance(strategy = InheritanceType.JOINED)
public class Human implements Serializable{
private static final long serialVersionUID = 1L;
public static enum Gender{
Male,
Female}
@Id
@GeneratedValue
private Integer id;
@Enumerated(EnumType.STRING)
private Gender gender;
@Column
@Temporal(TemporalType.DATE)
private Date dateOfBirth;
private String firstName;
private String middleName;
private String lastName;
// getters,setters
}
@Entity
@PrimaryKeyJoinColumn
public class User extends Human{
private static final long serialVersionUID= 1L;
@Column
@Temporal(TemporalType.DATE)
private Date registrationDate;
private Boolean activationStatus;
private String activationCode;
private String login;
private String password;
private String sessionCode;
private String email;
private String country;
private String city;
private String avatarURL;
private String description;
// getters,setters
}
和数据库结构如下:
human
(
dateofbirth date NOT NULL,
firstname text NOT NULL,
middlename text NOT NULL,
lastname text NOT NULL,
id serial NOT NULL,
gender text,
CONSTRAINT "Human_id" PRIMARY KEY (id )
)
"user"
(
login text NOT NULL,
password text NOT NULL,
activationcode text NOT NULL,
activationstatus status NOT NULL,
avatarurl text NOT NULL,
city text NOT NULL,
country text NOT NULL,
description text NOT NULL,
registrationdate date NOT NULL,
email text NOT NULL,
id integer,
CONSTRAINT uid PRIMARY KEY (id )
)
当我尝试运行我的项目(简单单元测试)时,我得到下一个错误:
org.postgresql.util.PSQLException: ERROR: column human0_1_.id does not exist
Позиция: 778
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
at org.tempos.server.modules.users.HumanTest.testGetId(HumanTest.java:31)
...
(我剪掉了日志的尾部,而它在JUnit方法中响应invokin)。
生成的查询(失败):
select human0_.id as id3_0_, human0_.dateOfBirth as dateOfBi2_3_0_, human0_.firstName as firstName3_0_, human0_.gender as gender3_0_, human0_.lastName as lastName3_0_, human0_.middleName as middleName3_0_, human0_1_.activationCode as activati1_4_0_, human0_1_.activationStatus as activati2_4_0_, human0_1_.avatarURL as avatarURL4_0_, human0_1_.city as city4_0_, human0_1_.country as country4_0_, human0_1_.description as descript6_4_0_, human0_1_.email as email4_0_, human0_1_.login as login4_0_, human0_1_.password as password4_0_, human0_1_.registrationDate as registr10_4_0_, human0_1_.sessionCode as session11_4_0_, case when human0_1_.id is not null then 1 when human0_.id is not null then 0 end as clazz_0_ from Human human0_ left outer join User human0_1_ on human0_.id=human0_1_.id where human0_.id=?
可以看到,它试图在human1_1_. id(最初是User.id)上加入列,但没有在查询的SELECT部分指定和获得。
我所尝试的:
任何人,请给我一些想法!
您的类应该如下所示:
Human
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Human implements Serializable {
private static final long serialVersionUID = 1L;
public static enum Gender {
Male, Female
}
@Id
@GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
private Gender gender;
private String firstName;
private String lastName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
.....
}
用户
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@PrimaryKeyJoinColumn
public class User extends Human {
private static final long serialVersionUID = 1L;
@Column
@Temporal(TemporalType.DATE)
private Date registrationDate;
public Date getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(Date registrationDate) {
this.registrationDate = registrationDate;
}
....
}
看到没
问题解决了,主要是因为myhaylo
此问题的原始原因一直由SQE PMD插件标记——“User”是SQL-99语法中的关键字。因此(看起来像),需要引用表名。它在PgAdmin查询浏览器中引用,但在Hibernate生成的查询中没有引用,事实上,在这种情况下,human0_1_中也没有引用。id,它必须指向用户。身份证,没有指向任何地方
将类和表名更改为其他名称(如AndhorUser)后,现在发布的原始数据库结构和类定义运行良好。
我有一个项目,其中一部分数据结构是用@ Inheritance(strategy = Inheritance type)制作的。已加入)。数据结构的这一部分看起来像这样: 该设计基于本文的思想。我使用Hibernate和JPA2接口作为我的数据层。上面的结构产生了下面的pojo/dao类(省略了getter和setter): 基本项: 物理项目: 一些硬件: 其他硬件: 这是我的问题: 我的另一个
问题内容: 是否可以对不是标识符/不是复合标识符一部分的某些列使用DB序列? 我正在使用hibernate作为jpa提供程序,并且我有一个表,其中包含一些生成的值(使用序列)的列,尽管它们不是标识符的一部分。 我想要的是使用序列为实体创建新值,其中序列的列不是主键(的一部分): 然后,当我这样做时: 该ID将被生成,但该属性也将由我的JPA提供程序生成。 为了清楚起见:我希望Hibernate生成
我正在尝试创建jpa存储库,但外键主键存在问题。虽然它是在抽象基类(
FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv
问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方
有人能解释我这里发生了什么,为什么? 此代码的输出将是3 3,3,3。 如果我只用 getter 取消注释第 1 行,输出将是 3 2、2、2。 如果我只用setter取消对第2行的注释,输出将是1 1,1,1。 如果我取消对第1行和第2行的注释(用setter和getter),输出将是1 3,3,3。 如果用子类中的代码覆盖父类中的方法,则该覆盖方法不能访问私有成员变量,即使父类中被覆盖的方法可